cron :отправлять ошибки в системный журнал вместо MTA

#!/bin/sh

term_handler () {
    if [ "$ok_to_exit" -eq 1 ]; then
        echo 'exiting'
        exit
    else
        echo 'refusing to exit'
    fi
}

trap term_handler TERM

ok_to_exit=0
pkill -f test.sh
ok_to_exit=1

while true; do
    echo 'working...'
    sleep 2
done

Этот сценарий (, более простая версия которого приведена ниже, )устанавливает обработчик сигнала, функцию term_handler, которая завершает сценарий при получении сигнала TERM, если ok_to_exitзначение переменной 1.

В теле скрипта есть цикл, имитирующий некоторую форму выполняемой работы. Важно то, что перед вызовомpkill(вы можете изменить это на команду killall), она устанавливает ok_to_exitна 0, а сразу после этого устанавливает ее на 1.

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

При запуске этот скрипт будет выводить

refusing to exit
working...
working...
working...

Когда запускается другая копия скрипта, он выводит exitingи затем завершается.

Упрощенная версия того же скрипта:

#!/bin/sh

trap '' TERM
pkill -f test.sh
trap - TERM

while true; do
    echo 'working...'
    sleep 2
done

Это просто игнорирует сигнал TERMво время вызова pkill, а затем восстанавливает обработчик сигнала по умолчанию перед продолжением.

1
06.06.2020, 12:18
0 ответов

Теги

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