
У меня есть такой скрипт диспетчера.
while read line
do
java TestProg $line &
done < $tasklist
НаПроцесс зомби Страница Википедии, он говорит
если родительский процесс не вызовет wait, зомби останется в таблице процессов, что приведет к утечке ресурсов
в скрипте выше я не использовал функцию wait
(я написал много скриптов оболочки диспетчера таким образом). Мне интересно, нужно ли мне использовать wait
это, чтобы предотвратить зомби-процессы:
while read line
do
java TestProg $line &
done < $tasklist
wait
решение1
У меня есть 2 ответа:
Если родитель умирает/заканчивается, то процессы наследуются init. init сделает это за вас. Так что для краткосрочных процессов вам не о чем беспокоиться. Совет должен быть call wait
или exit
.
Я думаю, что вызовы bash ждут вас и помещают куда-нибудь код выхода.
wait
получает только коды выхода, затем пожинает процесс. Зомби использует мало ресурсов, все освобождается, кроме слота в таблице процессов: идентификатор процесса и т. д.
Зомби мертв: все его ресурсы освобождены, кроме его слота в таблице процессов. Причина, по которой его слот в таблице процессов не освобожден, заключается в том, что родитель может (помимо прочего) получить свой код возврата и сообщить дочернему процессу, который только что умер, не задев другой процесс, который повторно использует идентификатор процесса (pid).