Бывает строка процесса, которую не убирает даже kill -9, — с буквой в STAT, которой не было в прошлых уроках. Посмотри на такую строку и попробуй убрать её сигналом KILL.
Строка Z и kill -9
В каталоге ~/zombie-lab выполни три команды: строки программы spooler, kill -9 по процессу из файла zombie.pid и снова его строку. $(cat zombie.pid) подставляет в команду содержимое файла — номер процесса.
Сначала предположи
Что покажет последняя команда после kill -9?
Теперь начни упражнение, выполни команду и сверь прогноз с выводом.
Z — зомби. Процесс уже завершился: его программа не выполняется, память освобождена. В таблице процессов осталась строка с кодом завершения — его должен забрать родитель. Ты делал то же в оболочке: wait забирал код фонового задания.
Пока родитель не забрал код, строка висит. Сигнал ей не поможет: получать его некому, поэтому kill -9 завершился без ошибки, а строка осталась. Если родитель завершится, его зомби достаются systemd с PID 1, и тот сразу забирает их коды.
Один зомби безвреден: он не занимает ни процессор, ни память. Беда — в родителе, который не забирает коды: зомби копятся. Поэтому разбираются с родителем: по PPID находят программу и выясняют, умеет ли она забрать коды по просьбе. Завершить родителя — крайняя мера: вместе с ним остановится и его работа.
В ps висит строка Z, её родитель — рабочая программа. Что уберёт строку?
-
Строка Z — запись в таблице процессов, к файлу программы она не привязана. Её убирает родитель, когда забирает код.
-
Строка висит, пока родитель жив и не забрал код. Её забирает родитель, а после его завершения — systemd.
-
Зомби уже завершился, сигнал ему ничего не сделает: в упражнении строка Z после
kill -9осталась на месте.
Зомби уже завершился и ждёт, пока родитель заберёт код завершения. Поэтому разбираются с родителем: найти его по PPID и выяснить, может ли он забрать код, не завершаясь.