C 如何向Linux守护进程/服务传递参数
我创建了一个Linux守护进程(用C语言),通过UDP将某些信息发送到另一台计算机。当然,它需要远程IP地址和端口号。我将这个守护进程存储在C 如何向Linux守护进程/服务传递参数,c,linux,daemon,C,Linux,Daemon,我创建了一个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和/或
/usr/local/bin/
中,并在/etc/init.d/
中创建了一个脚本来启动|停止|重新启动守护进程
到目前为止,IP地址和端口号直接通过脚本传递给守护进程。例如,脚本的start()部分如下所示:
start() {
/usr/local/bin/lvsload_udp_s 192.168.122.25 47239
}
因此,当远程IP和/或端口号更改时,我必须修改脚本,而不是修改某些配置文件。我知道这是一种不好的做法
向我的守护进程传递参数的最佳方式是什么?谢谢
Q:到目前为止,IP地址和端口号都传递给了
守护进程,直接。。。我知道这是一种不好的做法
你为什么认为这是“坏习惯”
“良好做法”包括:
- “干燥”(不要重复自己-只在一个地方存储数据)
- “吻”(保持简单,愚蠢)
- 将配置文件存储在/etc中(将应用程序存储在/usr/local/bin中) 。。。或者
- 将配置文件存储在应用程序的安装目录中(并可能定义一个全局环境变量以指向安装目录)
如果您使用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
中,然后使用以下代码从init脚本中获取环境变量:
. /etc/myDaemon.env
但是您的情况非常简单,我也不认为在脚本中保留参数有问题。为什么您认为命令行参数不好 配置文件是额外的工作,因为您需要解析它们。按照您的示例,修改配置文件=修改一个文件。修改脚本=修改一个文件。当你只有少量的论据时,似乎没有什么不同。您甚至可以将参数粘贴到脚本顶部的变量中,这使得它几乎像一个配置文件:-)有些脚本甚至源于这样的“变量设置脚本”,因此它看起来确实像一个配置文件
如果您能找到命令行参数不好的原因,那么很有可能您也知道应该使用什么来代替。另一方面,如果您甚至无法解释为什么命令行参数不好,那么使用它们可能没有什么错…什么可以阻止您使用配置文件?例如,您可以在守护进程中安装一个信号处理程序。。。并让它在收到信号后重新读取配置文件:
kill-SIGUSR1 nnn
(其中nnn
是守护进程的pid)。我认为它工作正常,因此不需要配置文件。只为两个参数解析一个配置文件?实际上我正在使用Ubuntu。你说的应该对我也有用,对吧?我应该写“思考”而不是“知道”。非常感谢你的建议,我真的很感激。这看起来很棒。我将如何以及在哪里设置MY_DAEMON_端口和MY_DAEMON_主机?正如您所说,以及其他建议,由于我的问题很简单,我想我更愿意在脚本中保留参数,但我会记住一个更大问题的环境变量的用途。谢谢你的回答。我试图使我的代码尽可能“完美”,我认为我“必须”使用某种配置文件@paulsm4同意你的观点,这很好:)