如何将parameter passing给Linux守护进程/服务

我创build了一个Linux守护进程(使用C语言),通过UDP将某些信息发送到另一台计算机。 它当然需要远程IP地址和端口号。 我将这个守护进程存储在/usr/local/bin/并且还在/etc/init.d/创build了一个脚本来启动|停止|重新启动守护进程。

到目前为止,IP地址和端口号直接由脚本传递到守护进程。 例如,脚本的start()部分如下所示:

 start() { /usr/local/bin/lvsload_udp_s 192.168.122.25 47239 } 

所以,当远程IP和/或端口号改变时,我不得不修改我的脚本,而不是修改一些configuration文件。 我知道这是一个糟糕的做法。

将parameter passing给守护进程的最佳方式是什么? 谢谢

你为什么觉得命令行参数不好?

配置文件是额外的工作,因为你需要解析它们。 和你的例子,修改配置文件=修改一个文件。 修改脚本=修改一个文件。 当你只有少量参数时,看起来没什么区别。 甚至可以将参数粘贴到脚本顶部的变量中,这使得它几乎就像一个配置文件:-)一些脚本甚至提供这样的“变量设置脚本”,所以它看起来像一个配置文件。

如果你能找到一个命令行参数不好的原因,那么你很有可能会知道如何使用它。 另一方面,如果你甚至不能解释为什么命令行参数不好,那么使用它们可能没什么问题。

问:到目前为止,IP地址和端口号直接传递给守护进程…这是一个不好的做法,我知道。

– 答:你为什么认为这是“坏习惯”?

“良好做法”包括:

  • “干”(不要重复自己 – 只在一个地方存储数据)

  • “吻”(保持简单,愚蠢)

我会说一个参数(命令行IP地址)在一个脚本(你的init.d启动脚本)坚持两个原则相当好:)

恕我直言…

PS:

如果你真的认为配置文件是合适的 – 如果有很多复杂的配置数据需要在启动时解析),那么两个适当的地方是:

  • 将配置文件存储在/ 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 ,然后使用以下命令从init脚本获取:

 . /etc/myDaemon.env 

但是你的情况很简单,我也没有看到在脚本中保留参数的问题。