Убить все подпроцессы демона
Я пишу /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
Это работает должным образом, но это кажется мне менее надежным, и бывают случаи, когда это не подходит (когда двоичный вызов менее прямой, или у него есть собственные дочерние элементы и т. Д.).
2 ответа
Если вы передадите id родительского процесса pkill, он убьет всех детей:
pkill -TERM -P parentID
Для конкретного сценария, представленного в вопросе, также стоит рассмотреть следующий вариант для
/usr/local/bin/mydaemon
:
#!/bin/bash
exec binary with some args
Вместо того, чтобы запускаться в подпроцессе с новым PID,
binary
вместо этого возьмет на себя PID процесса оболочки и, следовательно, получит сигналы непосредственно от сценария инициализации.
Вы можете настроить trap
, который заботится о процессе очистки при получении SIGINT. Например:
function cleanup { kill $CHILDPID; exit 0; }
trap cleanup SIGINT SIGTERM
Смотрите здесь для большего количества примеров.