1

Я работаю над сценарием, предназначенным для запуска / остановки набора служб. Для остановки необходимо завершить многие процессы, которые могут занять некоторое время и могут зависнуть.

Сценарий должен проверить, что процесс действительно завершен, и отправить электронное письмо, если этого не произошло после определенного периода.

Вот что у меня есть:

pkill -f "stuff"

for i in {1..30}; do
    VERIFICATIONS=$i
    if verification_command then
        echo "It's gone"
        break
    fi
    sleep 2
done

if [ $VERIFICATIONS -ge 30 ]; then
   echo "failed to terminate"
   # send mail
fi

Есть лучший способ сделать это?

2 ответа2

0

Нашел, как я полагаю, лучший подход, основываясь на комментариях Napcae: используйте функцию.

assert_service_stopped () {
    for i in {1..30}; do
        if verification_command then
            echo "It's gone"
            return 0
        fi
        sleep 2
    done
    echo "It hangs dude!"
    return 1
}        

pkill -f "stuff"

if ! assert_service_stopped; then
    echo "failed to terminate"
    # send mail
fi

Это имеет преимущество, заключающееся в том, что многие утверждения легко выполняются, и когда не требуется никаких действий (например, отправка электронного письма), утверждения могут выполняться последними, и состояние завершения сценария будет отражать результат подтверждений.

0

Я не уверен, какую часть вы хотите улучшить. Что касается убийства, многие процессы хранят свой собственный pid (= идентификатор процесса) в каталоге /var /run, в файле с расширением .pid, который содержит только свой pid, и ничего больше.

Этот pid используется программами для самоубийства (самоубийства?). Если программа перезапускается сама (частая причина невозможности убить программу), новый pid будет отличаться от старого. Все это относится конкретно к услугам, т. Е. К программе, с которой вы можете остановиться

 sudo service sshd stop

(в Debian и его производных). Возможно, вы рассмотрите возможность реализации аналогичного механизма.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .