Убейте 10-минутный зомби-процесс в скрипте linux bash

Я возился с ответом регулярного выражения yukondude с небольшим успехом. Я пытаюсь убить процессы старше 10 минут. Я уже знаю, что такое идентификаторы процессов. Я перебираю массив каждые 10 минут, чтобы увидеть, есть ли какие-либо затяжные процессы и их нужно убить. У кого-нибудь есть быстрые мысли по этому поводу?

ps -eo uid,pid,etime 3233332 | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {}

person Steve    schedule 04.05.2010    source источник
comment
Эхо... эхо... ... ...   -  person Dennis Williamson    schedule 04.05.2010


Ответы (1)


Как и настоящие зомби, процессы зомби нельзя убить — они уже мертвы.

Они исчезнут, когда их родительский процесс вызовет wait(), чтобы получить свой код выхода, или когда их родительский процесс завершится.


О, вы вообще не о процессах Зомби говорите. Этот сценарий bash должен соответствовать тому, что вам нужно:

ps -eo uid,pid,lstart |
    tail -n+2 |
    while read PROC_UID PROC_PID PROC_LSTART; do
        SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
        if [ $PROC_UID -eq 1000 -a $SECONDS -gt 600 ]; then
            echo $PROC_PID
        fi
     done |
     xargs kill

Это убьет все процессы, принадлежащие UID 1000, которые работают дольше 10 минут (600 секунд). Вероятно, вы захотите отфильтровать его только по интересующим вас PID - возможно, по идентификатору родительского процесса или аналогичному? Во всяком случае, это должно быть что-то, чтобы продолжать.

person caf    schedule 04.05.2010
comment
Извините, я использовал «зомби», поскольку это то, что я нашел, когда гуглил. На самом деле это часть демона, который запускает PHP-скрипты, которые иногда завершаются некорректно. - person Steve; 04.05.2010
comment
Ах, это работает... в основном. Я на OSX ... есть ли способ сравнить дату, кроме как с датой -d? Mac не разрешает -d. - person Steve; 04.05.2010
comment
Ну, проблема в том, что ps на самом деле не дает прошедшее время или время начала процесса в особенно хорошем формате. Конечно, его можно разобрать, но это хлопотно — самый простой способ для вас — собрать GNU date для вашей машины с OS X и явно использовать его в сценарии, а не системный date. - person caf; 04.05.2010
comment
Какой сигнал отправляется дочернему процессу, когда их родитель вызывает wait() или когда их родители выходят. - person Ali Mezgani; 02.04.2017