Команда TRAP у Linux/Unix на прикладах

Команда TRAP у Linux/Unix на прикладах
4 хв. читання
09 жовтня 2023

Запуск та керування процесами в операційній системі 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.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація