Ответ 1
Вы должны сделать демоны демонов, чтобы убить их, когда отец убит (или умирает), в противном случае они будут приняты init (1).
Один из моих коллег сказал мне сегодня утром, когда он убил supervisord с помощью "kill -9", подпроцессы супервизора не убит.
Он совершенно уверен в этом, но я много раз пробовал и не обнаружил, что это происходит.
Итак, когда родительский процесс убивается "kill -9", linux гарантирует, что его подпроцессы также были убиты?
Вы должны сделать демоны демонов, чтобы убить их, когда отец убит (или умирает), в противном случае они будут приняты init (1).
Нет, дочерние процессы не обязательно убиваются, когда родитель убит.
Однако, если у ребенка есть открытый канал, который он пишет, а родительский читает, он получит SIGPIPE, когда он попытается записать в трубу, для которого действие по умолчанию - это его убить. Часто это происходит на практике.
В UNIX не существует принудительной связи между сроками жизни родителей и дочерних процессов. Строго говоря, процесс заканчивается только при вызове exit() или получении необработанного сигнала, для которого действие по умолчанию прекращается.
Однако вся "группа процессов переднего плана" в "управляющем терминале" может принимать сигналы, такие как SIGINT и SIGQUIT, когда пользователь нажимает на ctrl-C, ctrl-\и т.д. на этом терминале. Конкретное поведение частично реализуется оболочкой входа (с помощью драйвера tty). Подробности могут быть довольно сложными: посмотрите здесь и здесь
Если u закроет терминал pid, который является родительским идентификатором процесса, тогда терминал закрыт. И когда терминал закрыт, все его процессы также убиваются. Но если u создаст суб-оболочку в оболочке, тогда, если u создаст какой-либо процесс и убьет ppid этого процесса, тогда только эта суб-оболочка убивает, а их ребенок становится сиротами. Их родительский элемент становится init и pid равен 1.
[стажер @SIPL ~] $ps -ef | grep sleep trainee 3893 3870 0 10:55 pts/1 00:00:00 sleep 4000 стажер 3895 3788 0 10:55 pts/0 00:00:00 grep --color = автоматический сон [стажер @SIPL ~] $kill - 9 3870 [стажер @SIPL ~] $ps -ef | grep sleep trainee 3893 1 0 10:55 pts/1 00:00:00 sleep 4000 ученик 3906 3788 0 10:55 pts/0 00:00:00 grep --color = автоматический сон
Вам просто нужно знать, какой процесс или услугу вы хотите убить. В моем случае httpd есть.
killall -9 httpd
Он убьет все дочерние процессы httpd.