【发布时间】:2012-09-04 13:46:45
【问题描述】:
我正在写/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在/var/run/mydaemon.pid中记录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
它可以正常工作,但这对我来说似乎不太健壮,而且有时这是不合适的(当二进制调用不那么直接,或者它有自己的孩子时,等等)。
【问题讨论】:
标签: bash subprocess kill init.d lsb