Обработка сигналов в 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 несколько раз.
Как видите, все просто.


Tags: ,

Четверг, Декабрь 2nd, 2010 Советы
Tinkerbell Personal Checks |Garden Planters | Jewellery For Women | Best Dog Foods | Budget Wedding Gowns | Shop For Jewellery | Vintage Jewellery| Diamante Jewellery | Car Finance Credit | DoorStep Loans