BashЯзык командного интерпретатора bash. Part 8. «Обработка сигналов и протоколирование»

И настал, наконец, черёд восьмого топика о командном интерпретаторе bash. Им я завершаю свой цикл статей. Сегодня будет рассмотрена обработка сигналов в bash и протоколирование. Данный топик, также как и предущий, будет небольшим в связи с прямо пропорциональной зависимостью от объёма информации.
Возможности bash позволяют перехватывать и обрабатывать сигналы с помощью сценария. Под сигналами понимается средство, позволяющее сообщать процессам о различных событиях в операционной системе.
Список всех сигналов можно получить, введя команду:
$ kill -l

Перехватывать сигналы позволяет команда trap. Общий синтаксис команды:
trap [-lp] [команды сигнал сигнал …]

Ключ –l выводит список имён и номеров сигналов, а ключ –p выводит список команд, связанных с каждым сигналом. Сигналы следует указывать по именам либо по номерам.
Система всегда каким-либо образом реагирует на получение сигнала, то есть выполняет команду. Если же вместо команды указать пустую строку, то сигнал просто будет проигнорирован.
Приведу небольшой список наиболее часто встречающихся сигналов:
HUP – hangup, отбой;
INT – interrupt, прерывание;
QUIT – выход;
ILL – illegal instruction, программная ошибка;
FPE – floating point exception, вычислительная ошибка;
KILL – убить процесс;
TERM – termination, завершить процесс;
CHILD – завершился дочерний процесс.
Пример:
trap '' INT #игнорировать сигнал INT

Для того, чтобы протоколировать процесс работы своего скрипта, нужно использовать команду tee. Команда копирует данные из своего стандартного потока ввода и раздваивает их на стандартный поток ввода и в указанный файл лога. Для пояснения приведу пример:
$ cat listfile* | sort | tee check.file | uniq > result.file

Здесь, в файл check.file будут записаны данные из всех «listfile*», в отсортированном виде до того, как повторяющиеся строки будут удалены командой uniq.
Также существует другой способ протоколирования. Он заключается в использовании команды script, которая копирует в файл весь сеанс работы в текстовой консоли: ввод пользователя и вывод команд. Если производить запуск команды script вручную, то остановить протоколирование можно командой exit.
Приведу пример:
LOGFILE=log
if [ "$LOGGING" == "true" ]; then
script myscript $LOGFILE; else
myscript;
fi

Для того, чтобы вызвать сценарий внутри своего сценария, нужно использовать команду exec:
exec script $0 $LOGFILE


На этом я заканчиваю свой цикл топиков о командном интерпретаторе bash. Надеюсь, кому-то они понадобились или же понадобятся для того, чтобы научиться писать свои сценарии для оболочки bash. Думаю, что данный цикл немного помог самому сайту в плане СЕО :). Также выражаю огромную благодарность пользователю aonick, который на всём протяжении публикации цикла статей, комментировал посты и добавлял свои примеры.

Комментарии (3)

Добавка:
1)Сигналы:
HUP – hangup(требуется переподключение, многие службы получив этот сигнал перечитывают свой конфиг);
INT – interrupt, прерывание с клавиатуры(что делать при нажатие Ctrl-C);
KILL – убить(безусловно — нет шанса отказатся умерать) процесс;
TERM – termination, завершить процесс — просьба процессу умереть;
STOP — застопить процесс (безусловно — нет шанса отказатся)
CONT — продолжить выполнение застопленного процеса

2) А еще есть: killall и xkill

3) У команды tee есть опция -a — означает append — то есть если указанный файл-логов существует то его не перезаписать. а дописывать в него

4) А про script — её часто просят запустить техподдержка в случае какой-нить проблемы и затем выполнить стандартный набор команд по списку, которые собирают информацию по системе — и затем прислать им собранный script'ом файл.
  • avatar
  • Dez
  • 18 июля 2009, 14:26
  • #
  • 2
Спасибо. Надеемся, что ты еще будешь писать статьи на ОупенЛайфе=)
Конечно же новые топики будут :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.