我正在写一个/etc/init.d/mydaemon
:
# ...
source functions # LSB compliant
EXEC=/usr/local/bin/mydaemon
PROG=mydaemon
function start() {
daemon --pidfile=/var/run/mydeamon.pid ${EXEC}
}
function stop() {
killproc ${PROG}
}
# ...
我的/usr/local/bin/mydaemon
:
#!/bin/bash
trap "trap TERM ; kill 0" TERM
binary with some args
AFAIK,这应该有效,因为:
daemon
mydaemon
将的 PID记录在/var/run/mydaemon.pid
killproc
读取该PID并发SIGTERM
送到该PID。mydaemon
陷阱这个信号,禁用陷阱并发SIGTERM
送到整个PGRP
,包括进程binary with some args
。
但是,这不起作用。停止服务后,mydaemon
终止,但binary
仍在运行。
我错过了什么,停止守护进程及其所有子进程的最佳做法是什么?
顺便提一句:
当我的 /usr/local/bin/mydaemon 是:
#!/bin/bash
binary with some args &
echo $! $$ > /var/run/mydaemon.pid
wait
它工作正常,但这对我来说似乎不太健壮,而且有时这是不合适的(当二进制调用不那么直接,或者它有自己的孩子时,等等)。