我创建了一个Linux守护进程(用C语言)通过UDP将某些信息发送到另一台计算机。它当然需要远程IP地址和端口号。我将这个守护程序存储在/usr/local/bin/
中,我还在/etc/init.d/
中创建了一个脚本来启动|停止|重新启动守护进程。
到目前为止,IP 地址和端口号由脚本直接传递给守护程序。例如,脚本的 start() 部分如下所示:
start() {
/usr/local/bin/lvsload_udp_s 192.168.122.25 47239
}
因此,当远程 IP 和/或端口号更改时,我必须修改我的脚本,而不是修改某些配置文件。我知道这是一种不好的做法。
将参数传递给我的守护程序的最佳方法是什么?谢谢
为什么你认为命令行参数不好?
配置文件是额外的工作,因为您需要解析它们。按照您的示例,修改配置文件 = 修改一个文件。修改脚本 = 修改一个文件。当你只有少量的参数时,似乎没有太大的区别。您甚至可以将参数粘贴到脚本顶部的变量中,这使它几乎像一个配置文件:-)一些脚本甚至源这样的"变量设置脚本",所以它看起来真的像一个配置文件。
如果您能找到命令行参数不好的原因,那么您很有可能也会知道该改用什么。另一方面,如果您甚至无法解释为什么命令行参数不好,那么使用它们可能没有错......
问:到目前为止,IP 地址和端口号将传递给 守护进程,直接...我知道这是一种不好的做法。
答:你为什么认为这是"不好的做法"????
"良好做法"包括:
-
"DRY"(不要重复自己 - 将数据存储在一个且只有一个地方)
-
"KISS"(保持简单,愚蠢)
我会说一个脚本(您的 init.d 启动脚本)中的一个参数(命令行 IP 地址)很好地遵守了这两个原则:)
恕我直言...
附注:
如果你真的认为配置文件是合适的 - 如果有很多复杂的配置数据需要在启动时解析),那么两个合适的地方是:
-
将配置文件存储在/etc 中(将您的应用程序存储在/usr/local/bin 中)
。或。。
-
将配置文件存储在应用的安装目录中(并可能定义一个全局环境变量以指向安装目录)
这是特定于发行版的。 例如,在 debian 上,约定是/etc/init.d/foo 包含类似 "source/etc/default/foo" 的行。 该文件仅包含环境变量,例如 DAEMON_ARGS="--remote-ip=192.168.0.1"。
如果你使用 debhelper 构建一个 debian 软件包,它会自动为你创建这个结构。 我相信也有类似的工具来创建"标准"RPM。
使用环境变量:
// include stdlib for getenv
port = getenv("MY_DAEMON_PORT");
host = getenv("MY_DAEMON_HOST");
// convert port to integer...
我记得这有点传统,从init.d
启动的流程.
既然你提到你正在使用 Ubuntu,请查看/etc/environment
- 请参阅文档。但正如有人已经提到的那样,这取决于您的系统/发行版;另一种方法是将环境变量保留在例如 /etc/myDaemon.env
,然后使用以下命令从您的初始化脚本中获取该脚本:
. /etc/myDaemon.env
但是你的情况很简单,我也不认为在脚本中保留参数有问题。