Уничтожение родительского процесса вместе с дочерним процессом с помощью SIGKILL

Я пишу один сценарий оболочки, в котором у меня есть родительский процесс, и у него есть дочерние процессы, которые создаются sleep & команда. Теперь я хочу уничтожить родительский процесс, чтобы дочерний процесс также был уничтожен. Я смог сделать это с помощью команды ниже:

trap "kill $$" SIGINT
trap 'kill -HUP 0' EXIT
trap 'kill $(jobs -p)' EXIT

Эти команды работают с kill [parent_process_ID] команды, но если я использую kill -9 [parent_process_ID] тогда будет уничтожен только родительский процесс. Пожалуйста, направьте меня дальше, чтобы достичь этой функциональности, так что, когда я уничтожаю родительский процесс любой командой, тогда дочерний процесс также должен быть уничтожен.

2 ответа

Когда вы убиваете процесс один, он не убивает детей.

Вы должны отправить сигнал группе процессов, если вы хотите, чтобы все процессы для данной группы получили сигнал.

kill -9 -parentpid

В противном случае сироты будут связаны с init,

Ребенок может попросить ядро ​​доставить SIGHUP (или другой сигнал), когда родитель умирает, указав опцию PR_SET_PDEATHSIG в prctl() Syscall, как это:

prctl(PR_SET_PDEATHSIG, SIGHUP);

Увидеть man 2 prctl для деталей.

Отправка -9 сигнал (SIGKILL) программе не дает возможности выполнить собственные обработчики сигналов (например, ваш trap заявления). Вот почему детей не убивают автоматически. (В общем, -9 не дает приложению возможности убрать после себя.) Вы должны использовать более слабый сигнал, чтобы убить его (например, SIGTERM.)

Увидеть man 7 signal для деталей.

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