Убить все подпроцессы демона

Я пишу /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 записывает mydaemonPID в /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

Смотрите здесь для большего количества примеров.

Другие вопросы по тегам