Сценарий Bash для нахождения процессов-зомби?

Таким образом, недавно я заметил, что у меня есть процесс, который случайным образом откажет и станет зомби с PPID 1 (init). Мне сказали, что единственный способ зафиксировать это состоит в том, чтобы перезагрузить ПК (или отправить SIGCHLD в init, который.... рискован/бесполезен, от того, что я понимаю.)

По существу то, что я надеюсь делать, записать сценарий удара, который будет просто искать процесс-зомби и если существует один, перезагрузите ПК.

В настоящее время я использую этот сценарий для контроля самого процесса:

 ps auxw | grep ethminer | grep -v grep > /dev/null

 if [ $? != 0 ]
 then
    sudo reboot
 fi

Теперь, этот сценарий, кажется, хорошо работает, когда ethminer или РАБОТАЕТ или НЕ РАБОТАЕТ; это перезагрузит машину, если это не будет видеть ethminer в таблице процессов, и это ничего не делает, если это не видит его.

Однако (от моего по общему признанию свободного понимания) с тех пор нет никакого кода выхода, когда процесс становится зомби if [ $? != 0 ] не получает входа, и поэтому ничего не делает.

Есть ли так или иначе, я могу фиксировать/изменять этот сценарий, таким образом, он делает то, что я хочу, чтобы он сделал? Или я - путь от дорожки здесь?

Спасибо!

3
задан 1 September 2016 в 21:58

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, СОСТОЯНИЕ и КОМАНДА.

5
ответ дан 1 December 2019 в 15:35

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

Похожие вопросы: