Запуск та керування процесами в операційній системі Linux може бути не простим завданням. Однак, засоби, доступні в Linux для керування процесами, роблять це простішим та ефективнішим. Один із таких корисних інструментів - команда trap
. У цій статті ми докладно розглянемо, що ця команда робить і як її можна використовувати на практичних прикладах.
Що таке команда trap?
Команда trap
використовується для обробки сигналів, які можуть бути надіслані процесу. Сигнали - це спосіб для інших процесів або системи повідомляти процесу про певні події або стани. Наприклад, сигнал може бути надісланий процесу, щоб попросити його завершити роботу або перезавантажитися.
Команда trap
дозволяє нам визначити, які дії повинні бути виконані, коли процес отримує певний сигнал. Можливі дії включають в себе виконання певних команд, ігнорування сигналу або навіть завершення процесу.
Синтаксис команди trap
Синтаксис команди trap
виглядає так:
trap 'command' SIGNAL
-
'command'
- команда або список команд, які повинні бути виконані при отриманні сигналуSIGNAL
. -
SIGNAL
- ім'я сигналу, на який ми реагуємо.
Список сигналів на які може реагувати команда trap
можна вивести за допомогою параметра -l
$ trap -l
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 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
Приклади використання команди trap
Приклад 1: Обробка сигналу INT (Ctrl+C)
Один з найпоширеніших використань команди trap
- це обробка сигналу INT
(Ctrl+C), який припиняє виконання процесу. Ми можемо використовувати trap
, щоб змусити процес виконувати певні дії перед завершенням.
#!/bin/bash
cleanup() {
echo "Завершення виконання..."
# Додайте команди для очищення ресурсів або завершення інших завдань
exit 0
}
trap cleanup SIGINT
# Основний код програми
while true; do
echo "Робота..."
sleep 1
done
У цьому прикладі, коли користувач натискає Ctrl+C, програма спочатку виконує функцію cleanup
, а потім завершує роботу.
Приклад 2: Одночасне завершення декількох команд
Часто нам необхідно паралельно запускати декілька довгопацюючих команд. Це можна зробити запустивши кожну команду з окремого терміналу, але що робити якщо ми хочемо їх запустити одночасно з одного скрипта. Звичайно це можна зробити з використанням &
для фонового виконання наступним чином:
# Запускаємо фоновий процес 1
./background_process_1 &
# Запускаємо фоновий процес 2
./background_process_2 &
# Останній процес
./background_process_last
Даний скрипт запустить команди ./background_process_1
та ./background_process_2
в бекграунді та ./background_process_last
яка заблокує термінал.
Тепер якщо ми натиснемо Ctrl+C сигнал SIGINT
отримає лише остання команда, дві попередні так і залишуться запущеними і для їх зупинки нам доведеться їх шукати (наприклад за допомогою команди ps
) і завершувати самостійно.
Цю задачу можна легко вирішити за допомогою trap
. Приклад:
#!/bin/bash
# Встановлюємо обробник сигналу SIGINT
# та посилаємо сигнал з використанням kill запущеним в бекграунді процесам
cleanup() {
echo "Exiting..."
kill %1
kill %2
exit 0
}
trap cleanup SIGINT
# Запускаємо фоновий процес 1
./background_process_1 &
# Запускаємо фоновий процес 2
./background_process_2 &
# Останній процес
./background_process_last
У цьому прикладі, коли ви натискаєте Ctrl+C (що генерує сигнал SIGINT
), обробник сигналу запускає команду kill %1
та kill %2
, де %1
та %2
- це ідентифікатор першого та другого фонового процесу ./background_process_1 &
та ./background_process_2 &
. Це призведе до відправлення сигналу SIGTERM
цим процесам, які, в свою чергу, можуть обробити цей сигнал та завершити свою роботу.
Таким способом ви можете запускати необхідну кількість команд з одного скрипта та завершувати їх усі одночасно натисканням Ctrl+C.
Загалом, цей приклад ілюструє, як використовувати команду trap
для обробки сигналу SIGINT
та керування фоновими процесами, запущеними в фоновому режимі.
Заключення
Команда trap
- корисний інструмент в операційній системі Linux для обробки сигналів і керування процесами. Вона дозволяє програмістам контролювати поведінку своїх програм при отриманні різних сигналів. Знання про команду trap
може бути корисним для системних адміністраторів та розробників, які працюють з Linux.
Ще немає коментарів