Уничтожение родительского процесса вместе с дочерним процессом с помощью 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
для деталей.