Скрипт 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.

Другие вопросы по тегам