在Ubuntu上,我将/etc/init.d/ skeleton作为新文件复制,并将其设置为“全部”可执行文件(就像该目录中的其他文件一样)。 在这里,我创build了一个“foo”,它是/usr/sbin另一个Bash脚本,但是它的特殊之处在于,它等待来自PHP网页的命名pipe道连接。 (更多细节在这里 ,虽然这是一个侧面的话题。)
因为它必须在命名pipe道连接上等待一个循环,所以这个命令显然挂在命令行上。 没什么大不了的,因为我真的希望它挂起来,等待一个新的连接。 但我不希望它发生在前台。 所以,我让start-stop-daemon使用–background选项。
好的,它对启动和状态非常有用,但是停止不起作用 – 它将内存中的命令以及我在/usr/sbin/foo Bash脚本中的cat /tmp/pipe命令留在内存中。 他们警告说,在start-stop-daemon命令中使用–background选项时会发生这种情况。
问题
那么,在start-stop-daemon --background运行时,正确停止/ usr / sbin / foo的正确方法是什么?以及停止可能调用的任何subprocess(例如cat / tmp / pipe命令)通过/ usr / sbin / foo? 我的意思是,我想我可以使用killall,但这是致命的。 也许你知道更有效的方法?
我认为在这种情况下shell将成为包含脚本运行的各种命令的进程组的领导者。 您可以通过向进程组的PID的对面发送信号来终止进程组:
kill -TERM -$(cat /var/run/my_shell_daemon.pid)
我build议咨询LSB:
http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html
这是一个以Debian为中心的维基,同样也可能是有用的:
http://wiki.debian.org/LSBInitScripts
你通常把一个pid文件存放在/ var / run下的某个地方,然后在停止的时候显式的终止这个命令。