Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何向Linux守护进程/服务传递参数_C_Linux_Daemon - Fatal编程技术网

C 如何向Linux守护进程/服务传递参数

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和/或

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

向我的守护进程传递参数的最佳方式是什么?谢谢

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

你为什么认为这是“坏习惯”

“良好做法”包括:

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

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

我认为一个脚本(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
中,然后使用以下代码从init脚本中获取环境变量:

. /etc/myDaemon.env

但是您的情况非常简单,我也不认为在脚本中保留参数有问题。

为什么您认为命令行参数不好

配置文件是额外的工作,因为您需要解析它们。按照您的示例,修改配置文件=修改一个文件。修改脚本=修改一个文件。当你只有少量的论据时,似乎没有什么不同。您甚至可以将参数粘贴到脚本顶部的变量中,这使得它几乎像一个配置文件:-)有些脚本甚至源于这样的“变量设置脚本”,因此它看起来确实像一个配置文件


如果您能找到命令行参数不好的原因,那么很有可能您也知道应该使用什么来代替。另一方面,如果您甚至无法解释为什么命令行参数不好,那么使用它们可能没有什么错…

什么可以阻止您使用配置文件?例如,您可以在守护进程中安装一个信号处理程序。。。并让它在收到信号后重新读取配置文件:
kill-SIGUSR1 nnn
(其中
nnn
是守护进程的pid)。我认为它工作正常,因此不需要配置文件。只为两个参数解析一个配置文件?实际上我正在使用Ubuntu。你说的应该对我也有用,对吧?我应该写“思考”而不是“知道”。非常感谢你的建议,我真的很感激。这看起来很棒。我将如何以及在哪里设置MY_DAEMON_端口和MY_DAEMON_主机?正如您所说,以及其他建议,由于我的问题很简单,我想我更愿意在脚本中保留参数,但我会记住一个更大问题的环境变量的用途。谢谢你的回答。我试图使我的代码尽可能“完美”,我认为我“必须”使用某种配置文件@paulsm4同意你的观点,这很好:)