Сценарий командной оболочки может столкнуться с проблемами во время его выполнения, что приведет к появлению сигнала об ошибке, неожиданно прерывающего выполнение сценария.
Ошибки возникают из-за неправильной разработки сценария, действий пользователя или сбоев в системе. Сбойный сценарий может оставить после себя временные файлы, которые могут вызвать проблемы при перезапуске сценария.
Синтаксис команды Bash trap
Синтаксис команды trap следующий:
1 | 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. Затем скрипт печатает сообщение и завершает работу.
1 2 3 4 5 6 7 | trap "echo Сценарий завершен; exit" SIGINT while true do echo Test sleep 1 done |
Цикл while в приведенном выше примере выполняется бесконечно. Первая строка сценария содержит команду trap и инструкции по ожиданию сигнала SIGINT, затем вывод сообщения и выход из сценария.
Команда trap часто используется для очистки временных файлов, если сценарий завершается из-за прерывания. Следующий пример определяет функцию очистки, которая печатает сообщение, удаляет все файлы, добавленные в переменную $TRASH, и завершает работу сценария.
1 2 3 4 5 6 7 8 9 10 | $TRASH=$(mktemp -t tmp.XXXXXXXXXX) trap cleanup 1 2 3 6 cleanup() { echo "Удаление временных файлов:" rm -rf "$TRASH" exit } |
Ловушка в приведенном примере выполняет функцию очистки, когда обнаруживает один из четырех сигналов: SIGHUP, SIGINT, SIGQUIT или SIGABRT. Сигналы обозначаются их номерами.
Вы также можете использовать ловушку, чтобы гарантировать, что пользователь не сможет прервать выполнение сценария. Эта возможность важна при выполнении чувствительных команд, прерывание которых может привести к необратимому повреждению системы. Синтаксис для отключения сигнала следующий:
1 | trap "" [signal] |
Двойные кавычки означают, что ни одна команда не будет выполнена. Например, чтобы отловить сигналы SIGINT и SIGABRT, введите:
1 2 | trap "" SIGINT SIGABRT [команда, которая не должна быть прервана] |
Если вы хотите снова включить сигналы в любое время в ходе выполнения сценария, сбросьте правила с помощью символа тире:
1 2 | trap - SIGINT SIGABRT [команда, которую можно прервать] |
Сигнал SIGKILL нельзя перехватить. Он всегда немедленно прерывает выполнение сценария.