Зомби-процессы создаются в системах Unix / Linux. Мы можем удалить их с помощью kill
команды.
Но есть ли в Linux встроенный механизм очистки для обработки процессов зомби?
источник
Зомби-процессы создаются в системах Unix / Linux. Мы можем удалить их с помощью kill
команды.
Но есть ли в Linux встроенный механизм очистки для обработки процессов зомби?
Зомби-процессы уже мертвы. Вы не можете убить их. Команда kill
или системный вызов не влияют на процесс зомби. (Вы можете заставить зомби уйти kill
, но вы должны застрелить родителя, а не зомби, как мы увидим через минуту.)
Процесс зомби на самом деле не процесс, а всего лишь запись в таблице процессов. Других ресурсов, связанных с процессом зомби, нет: у него нет памяти или запущенного кода, он не держит открытых файлов и т. Д.
Когда процесс умирает, последним, что нужно сделать после очистки всех других ресурсов, является запись в таблице процессов. Эта запись сохраняется, образуя зомби, чтобы позволить родительскому процессу отслеживать состояние выхода дочернего элемента. Родитель читает статус выхода, вызывая одно из wait
семейства системных вызовов; в этот момент зомби исчезает. wait
Говорят, что призвание пожинает ребенка, расширяя метафору о том, что зомби мертв, но каким-то образом все еще не полностью переработан в загробную жизнь. Родитель также может указать, что ему все равно (игнорируя сигнал SIGCHLD или вызывая sigaction
с SA_NOCLDWAIT
флагом), и в этом случае запись в таблице процессов удаляется сразу после смерти ребенка.
Таким образом, зомби существует только тогда, когда процесс умер, а его родитель еще не вызвал wait
. Это состояние может длиться только до тех пор, пока родитель еще работает. Если родитель умирает раньше ребенка или умирает без чтения статуса ребенка, родительский процесс зомби устанавливается на процесс с PID 1, то есть init
. Одна из задач init
состоит в том, чтобы вызывать wait
цикл и таким образом пожинать любой процесс зомби, оставленный его родителем.
Вы не kill
зомби-процесс, так как он уже мертв.
Процессы зомби должны wait
редактироваться их родителями, чтобы можно было получить их статус выхода.
Единственный «встроенный механизм очистки», существующий в Linux, работает в том случае, если любой родительский процесс умирает до того, как он соберет свой дочерний статус выхода. В этом случае каждый дочерний объект наследуется init
процессом, который wait
на дочернем элементе собирает свой статус выхода и удаляет свою запись в таблице процессов.
Как только родитель процесса умирает, процесс становится сиротой - независимо от того, зомби это или нет. Что происходит с сиротами? Они получают новый родитель, называется init
. init
будет wait
на каждой сироте, которую он собрал, таким образом пожиная сироту (которая, возможно, также была зомби).
init
не убивает любой процесс. Толькоwait
его дети собирают свой статус.Нет, встроенного механизма очистки для зомби нет. Зомби попадают в рай зомби, как только их родитель убит. До тех пор ОС сохраняет их, чтобы они возвращали родительский статус выхода.
источник
init
процесс вступает во владение и назоветwait
его