【问题标题】:how to pass arguments to Linux daemon/service如何将参数传递给 Linux 守护进程/服务
【发布时间】:2012-07-05 08:34:54
【问题描述】:

我创建了一个 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 和/或端口号改变时,我必须修改我的脚本,而不是修改一些配置文件。这是一种不好的做法,我知道。

将参数传递给我的守护程序的最佳方式是什么?谢谢

【问题讨论】:

  • 是什么阻止你使用配置文件?
  • 你可以,例如,在你的守护进程中安装一个信号处理程序......并让它在接收到信号后重新读取配置文件:kill -SIGUSR1 nnn(其中nnn是你的守护进程的pid )。
  • 我认为它运作良好,因此不需要配置文件。只为两个参数解析一个配置文件?

标签: c linux daemon


【解决方案1】:

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

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

如果您能找到导致命令行参数不好的原因,那么您很有可能也知道应该使用什么。另一方面,如果您甚至无法解释为什么命令行参数不好,那么使用它们可能没有任何问题......

【讨论】:

  • 感谢您的回答。我正在努力使我的代码尽可能“完美”,并且我认为我“必须”使用某种配置文件。 @paulsm4 同意你的看法,这很好:)
【解决方案2】:

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

A:你为什么认为这是“不好的做法”????

“良好做法”包括:

  • “DRY”(不要重复自己 - 将数据存储在一处且仅一处)

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

我想说一个脚本(您的 init.d 启动脚本)中的一个参数(命令行 IP 地址)很好地遵守了这两个原则 :)

恕我直言...

PS:

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

  • 将配置文件存储在 /etc 中(并将您的应用存储在 /usr/local/bin 中)

    ...或..

  • 将配置文件存储在应用的安装目录中(并可能定义一个全局环境变量以指向安装目录)

【讨论】:

  • 我应该写“think”而不是“know”。非常感谢您的建议,我真的很感激。
【解决方案3】:

这是特定于发行版的。例如,在 debian 上,约定是 /etc/init.d/foo 包含类似“source /etc/default/foo”的行。该文件仅包含环境变量,例如DAEMON_ARGS="--remote-ip=192.168.0.1"。

如果您使用 debhelper 构建 debian 软件包,它将自动为您创建此结构。我确信也有类似的工具可以创建“标准”RPM。

【讨论】:

  • 其实我用的是 Ubuntu。你说的应该也适合我吧?
【解决方案4】:

使用环境变量:

// include stdlib for getenv

port = getenv("MY_DAEMON_PORT");
host = getenv("MY_DAEMON_HOST");

// convert port to integer...

我记得这对于从 init.d 启动的进程来说有点传统。

既然您提到您使用的是 Ubuntu,请查看 /etc/environment - 请参阅 docs。但是正如有人已经提到的,这取决于您的系统/发行版;另一种方法是将环境变量保留在例如/etc/myDaemon.env,然后从你的初始化脚本中获取:

. /etc/myDaemon.env

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

【讨论】:

  • 这看起来很棒。我将如何以及在哪里设置 MY_DAEMON_PORT 和 MY_DAEMON_HOST?
  • 正如你所说,以及其他建议,由于我的问题的简单性,我想我更愿意将参数保留在脚本中,但我会记住环境变量的使用更大的问题。谢谢
猜你喜欢
  • 2016-11-09
  • 2015-10-24
  • 1970-01-01
  • 2011-06-09
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2012-05-27
相关资源
最近更新 更多