Таким образом, недавно я заметил, что у меня есть процесс, который случайным образом откажет и станет зомби с PPID 1 (init). Мне сказали, что единственный способ зафиксировать это состоит в том, чтобы перезагрузить ПК (или отправить SIGCHLD в init, который.... рискован/бесполезен, от того, что я понимаю.)
По существу то, что я надеюсь делать, записать сценарий удара, который будет просто искать процесс-зомби и если существует один, перезагрузите ПК.
В настоящее время я использую этот сценарий для контроля самого процесса:
ps auxw | grep ethminer | grep -v grep > /dev/null
if [ $? != 0 ]
then
sudo reboot
fi
Теперь, этот сценарий, кажется, хорошо работает, когда ethminer или РАБОТАЕТ или НЕ РАБОТАЕТ; это перезагрузит машину, если это не будет видеть ethminer в таблице процессов, и это ничего не делает, если это не видит его.
Однако (от моего по общему признанию свободного понимания) с тех пор нет никакого кода выхода, когда процесс становится зомби if [ $? != 0 ]
не получает входа, и поэтому ничего не делает.
Есть ли так или иначе, я могу фиксировать/изменять этот сценарий, таким образом, он делает то, что я хочу, чтобы он сделал? Или я - путь от дорожки здесь?
Спасибо!
Вы не имеете к reboot
, когда они - процессы-зомби. Вот то, почему:
процесс А становится зомби, когда процесс закончен, но это - родитель, не звонил wait(2)
для получения, это - код возврата
, зомби не берет физических или виртуальных ресурсов только кроме записи в таблице процессов
ядра, После того как родитель звонит wait(2)
, зомби будут правильно пожинать, и запись таблицы процессов будет удалена
, Если зомби станет висячей строкой т.е. если это - родитель, умирает, затем init
(PID 1) наследует процесс и будет пожинать его путем вызова wait(2)
, Поскольку Вы видите, что это - вопрос времени, пока эти wait(2)
не назван, и зомби пожинают. Если Вы имеете многие зомби за время, полагаете, что это - дефект программирования, необходимо посмотреть на фиксацию (или попросить фиксацию), код вместо этого, а не reboot
луг, который является абсолютно ненужным и не должен быть сделан.
Для нахождения процессов-зомби доберитесь STATE
из процесса, если это Z
, затем процесс является зомби:
ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
Здесь я взял только выборочные поля а именно, PID, PPID, СОСТОЯНИЕ и КОМАНДА.