Обработка сигналов в sh
Сигналы – один из способов взаимодействия между процессами. Отправив определенный сигнал, можно приостановить или возобновить работы приложения, завершить его или сделать с ним еще что-нибудь. Сигнал определяется номером, которому соответствие имя. Посмотрите man signal или наберите kill -l чтобы получить список сигналов.
В скриптах обработка сигналов может быть крайне полезна.
Например, ваш скрипт выполняет обновление системы и тут происходит разрыв соединения с сервером… что получится в результате сказать сложно, скорее всего ничего хорошего. Конечно же можно запустить процесс через nohup, но можно поступить иначе – вписать обработку сигналов.
Или другой пример, скрипт в течение своей работы создает временные файлы, которые потом удаляются, но при нажатии Ctrl+С он завершит свою работу сразу и никакой чистки данных выполнять не будет. Но если обработать сигнал, то можно завершить работы скрипта куда элегантнее.
Для обработки сигналов в sh используется встроенная команда trap, формат ее такой
trap [action] signal ...
Т.е. команде нужно передать как минимум два параметра, действие при получении сигнала и сигнал, для которого будет выполняться указанное действие. Сигналов можно указать несколько подряд. В качестве пример напишем скрипт, которые при получении SIGHUP будет продолжать работать. Т.е. при закрытии консоли, в которое выполняется наш скрипт, он спокойно продолжит выполнение, а не завершится. При получении SIGINT скрипт удалит временные файлы и завершит работу, SIGINIT вызывается при нажатии Ctrl+C.
#!/bin/sh
TEMPFILE=`mktemp /tmp/XXXXXXX`
signalhandler() {
local signal=$1
case $signal in
SIGHUP)
echo "Do nothing"
;;
SIGINT)
rm -f $TEMPFILE
exit
;;
esac
}
trap "signalhandler SIGINT " SIGINT
trap "signalhandler SIGHUP " SIGHUP
# do something good
rm -f $TEMPFILE
exit 0
Для обработки сигналов используется наша функция signalhandler, которая в качестве параметра принимает имя сигнала, и в зависимости от него выполняет разные действия. Чтобы передать разные имена сигналов приходится вызывать trap несколько раз.
Как видите, все просто.
|
|