Скрипт Bash для поиска зомби-процессов?
Так недавно я заметил, что у меня есть процесс, который случайным образом завершается сбоем и становится зомби с PPID 1 (init). Мне сказали, что единственный способ исправить это - перезагрузить компьютер (или отправить SIGCHLD в init, что, как я понимаю, является рискованным / бесполезным).
По сути, я хочу написать bash-скрипт, который будет просто искать процесс зомби и, если он есть, перезагрузить компьютер.
В настоящее время я использую этот скрипт для мониторинга самого процесса:
ps auxw | grep ethminer | grep -v grep > /dev/null
if [ $? != 0 ]
then
sudo reboot
fi
Теперь этот скрипт работает нормально, когда ethminer либо работает, либо не работает; он перезагрузит машину, если не увидит ethminer в таблице процессов, и ничего не сделает, если не увидит ее.
Тем не менее, (из моего, по общему признанию, свободного понимания), так как нет кода выхода, когда процесс превращается в зомби if [ $? != 0 ]
не получает никакой информации и, следовательно, ничего не делает.
В любом случае я могу исправить / изменить этот скрипт, чтобы он делал то, что я хочу? Или я совсем не в курсе?
Спасибо!
1 ответ
Вам не нужно 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, STATE и COMMAND.