正确创建 Bash 守护进程脚本

正确创建 Bash 守护进程脚本

在 Ubuntu 上,我将/etc/init.d/Skeleton 复制为一个新文件,并将其设置为“全部”可执行(就像该目录中的其他文件一样)。在其中,我创建了一个“foo”,它只是 中的另一个 Bash 脚本/usr/sbin,但它的特殊之处在于它处于一个循环中,等待来自 PHP 网页的命名管道连接。(有关它的更多详细信息,请参阅这里,尽管这是一个次要话题。)

因为它必须在命名管道连接上循环等待,所以这显然会挂起命令行上的命令。这没什么大不了的,因为我实际上希望它挂起并等待新连接。但我不希望它在前台发生。因此,我让 start-stop-daemon 使用 --background 选项。

好的,它在启动和状态方面表现很好,但停止不起作用——它会将命令留在内存中,以及cat /tmp/pipe/usr/sbin/fooBash 脚本中的命令。他们警告说,在 start-stop-daemon 命令上使用 --background 选项时可能会发生这种情况。

问题

那么,当 /usr/sbin/foo 运行时,正确的停止方法是什么start-stop-daemon --background,以及停止可能由 /usr/sbin/foo 调用的任何子进程(例如 cat /tmp/pipe 命令)?我的意思是,我想我可以使用 killall,但这有点致命。也许你知道更有效的方法?

答案1

我认为在这种情况下,shell 将成为进程组包含脚本运行的各种命令。您可以通过向进程组 PID 的对立面发送信号来终止进程组:

kill -TERM -$(cat /var/run/my_shell_daemon.pid)

答案2

我建议咨询 LSB:

http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html

这里有一个以 Debian 为中心的 wiki,可能也会有用:

http://wiki.debian.org/LSBInitScripts

您通常会将 pid 文件存储在 /var/run 下的某个位置,然后在停止时明确终止该命令。

相关内容