Использование команды trap в Bash

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

Ошибки возникают из-за неправильной разработки сценария, действий пользователя или сбоев в системе. Сбойный сценарий может оставить после себя временные файлы, которые могут вызвать проблемы при перезапуске сценария.

linux

Синтаксис команды Bash trap

Синтаксис команды trap следующий:

Команда состоит из следующих компонентов:

  • Опции обеспечивают дополнительную функциональность команды.
  • Аргументы - это команды, которые trap выполняет при обнаружении сигнала. Если команда не состоит из одного слова, она должна быть заключена в кавычки (" "). Если аргумент содержит более одной команды, разделяйте их точкой с запятой (;).
  • Сигналы - это асинхронные уведомления, посылаемые системой, обычно указывающие на прерывание работы, вызванное пользователем или связанное с системой. Сигналы можно вызывать по их имени или номеру.

Параметры команды Bash trap

Команда trap принимает следующие опции:

  • -p - Отображает команды сигналов.
  • -l - Выводит список всех сигналов и их номера.

Ниже приведен полный список 64 сигналов и их номера:

1 SIGHUP
2 SIGINT
3 SIGQUIT
4 SIGILL
5 SIGTRAP
6 SIGABRT
7 SIGBUS
8 SIGFPE
9 SIGKILL
10 SIGUSR1
11 SIGSEGV
12 SIGUSR2
13 SIGPIPE
14 SIGALRM
15 SIGTERM
16 SIGSTKFLT
17 SIGCHLD
18 SIGCONT
19 SIGSTOP
20 SIGTSTP
21 SIGTTIN
22 SIGTTOU
23 SIGURG
24 SIGXCPU
25 SIGXFSZ
26 SIGVTALRM
27 SIGPROF
28 SIGWINCH
29 SIGIO
30 SIGPWR
31 SIGSYS
32 SIGWAITING
33 SIGLWP
34 SIGRTMIN
35 SIGRTMIN+1
36 SIGRTMIN+2
37 SIGRTMIN+3
38 SIGRTMIN+4
39 SIGRTMIN+5
40 SIGRTMIN+6
41 SIGRTMIN+7
42 SIGRTMIN+8
43 SIGRTMIN+9
44 SIGRTMIN+10
45 SIGRTMIN+11
46 SIGRTMIN+12
47 SIGRTMIN+13
48 SIGRTMIN+14
49 SIGRTMIN+15
50 SIGRTMAX-14
51 SIGRTMAX-13
52 SIGRTMAX-12
53 SIGRTMAX-11
54 SIGRTMAX-10
55 SIGRTMAX-9
56 SIGRTMAX-8
57 SIGRTMAX-7
58 SIGRTMAX-6
59 SIGRTMAX-5
60 SIGRTMAX-4
61 SIGRTMAX-3
62 SIGRTMAX-2
63 SIGRTMAX-1
64 SIGRTMAX

Сигналы 32 и 33 не поддерживаются в Linux, и команда trap -l не отображает их в выводе.

Сигналы, наиболее часто используемые с командой trap, следующие:

  • SIGHUP (1) - очистка
  • SIGINT (2) - прерывание
  • SIGQUIT (3) - Выход из системы
  • SIGABRT (6) - Отмена
  • SIGALRM (14) - Будильник
  • SIGTERM (15) - Завершение работы

 Префикс SIG в именах сигналов является необязательным. Например, сигнал SIGTERM также может быть записан как TERM.

Как использовать команду trap в Bash

Типичным сценарием использования команды trap является перехват сигнала SIGINT. Этот сигнал посылается системой, когда пользователь прерывает выполнение сценария нажатием Ctrl+C.

Следующий пример скрипта печатает слово "Test" каждую секунду, пока пользователь не прервет его выполнение нажатием Ctrl+C. Затем скрипт печатает сообщение и завершает работу.

Цикл while в приведенном выше примере выполняется бесконечно. Первая строка сценария содержит команду trap и инструкции по ожиданию сигнала SIGINT, затем вывод сообщения и выход из сценария.

Команда trap часто используется для очистки временных файлов, если сценарий завершается из-за прерывания. Следующий пример определяет функцию очистки, которая печатает сообщение, удаляет все файлы, добавленные в переменную $TRASH, и завершает работу сценария.

Ловушка в приведенном примере выполняет функцию очистки, когда обнаруживает один из четырех сигналов: SIGHUP, SIGINT, SIGQUIT или SIGABRT. Сигналы обозначаются их номерами.

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

Двойные кавычки означают, что ни одна команда не будет выполнена. Например, чтобы отловить сигналы SIGINT и SIGABRT, введите:

Если вы хотите снова включить сигналы в любое время в ходе выполнения сценария, сбросьте правила с помощью символа тире:

Сигнал SIGKILL нельзя перехватить. Он всегда немедленно прерывает выполнение сценария.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий