Введение

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

Создание Bash-скрипта

Начнем с создания нового файла Bash-скрипта, в котором мы реализуем команду trap.

  1. Откройте терминал в WebIDE. Вы увидите приглашение командной строки, заканчивающееся символом $.

  2. Перейдите в каталог проекта:

    cd ~/project

    Эта команда меняет текущий рабочий каталог на /home/labex/project.

  3. Создайте новый файл с именем trap_example.sh:

    touch trap_example.sh

    Команда touch создает пустой файл, если он не существует, или обновляет время его изменения, если он уже есть.

  4. Откройте файл trap_example.sh в редакторе WebIDE. Для этого щелкните по имени файла в проводнике в левой части интерфейса.

Реализация базовой команды trap

Теперь реализуем базовую команду trap в нашем скрипте, чтобы перехватывать определенные сигналы и корректно завершать работу.

  1. Добавьте следующее содержимое в файл trap_example.sh:

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up and exiting..."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done

    Разберем этот скрипт:

    • Первая строка #!/bin/bash называется шебанг (shebang). Она указывает системе, что этот скрипт должен выполняться оболочкой Bash.
    • Мы определяем функцию cleanup_and_exit, которая выводит сообщение и завершает работу скрипта.
    • Команда trap настроена на вызов функции cleanup_and_exit при получении сигналов SIGINT (прерывание) или SIGTERM (завершение). SIGINT обычно отправляется при нажатии Ctrl+C, а SIGTERM часто используется, когда процессу предлагается корректно завершить работу.
    • Команды echo выводят инструкции для пользователя.
    • Цикл while выполняется бесконечно, каждую секунду выводя сообщение и увеличивая счетчик.
  2. Сохраните файл после добавления содержимого.

Сделайте скрипт исполняемым и запустите его

Прежде чем запустить скрипт, нам нужно сделать его исполняемым. Это укажет системе, что данный файл можно запускать как программу.

  1. В терминале сделайте скрипт исполняемым:

    chmod +x ~/project/trap_example.sh

    Команда chmod изменяет права доступа к файлу. Опция +x добавляет право на выполнение.

  2. Запустите скрипт:

    ~/project/trap_example.sh

    Эта команда приказывает Bash выполнить наш скрипт.

  3. Скрипт начнет работу. Вы увидите инструкции на экране. Дайте ему поработать несколько секунд.

  4. Теперь нажмите Ctrl+C, чтобы прервать его. Вы должны увидеть сообщение "Signal received!" перед тем, как скрипт завершится. Это и есть работа нашей ловушки (trap)!

Использование функции в команде trap

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

  1. Откройте файл trap_example.sh в редакторе WebIDE.

  2. Замените содержимое файла следующим кодом:

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up..."
      echo "Performing cleanup tasks..."
      ## Add any necessary cleanup code here
      echo "Cleanup completed."
      echo "Exiting script gracefully."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap function in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done

    Рассмотрим изменения:

    • Мы расширили функцию cleanup_and_exit, добавив более подробные сообщения и место для кода очистки.
    • Теперь функция имитирует реальный процесс завершения, который может включать такие задачи, как закрытие дескрипторов файлов, удаление временных файлов или освобождение других ресурсов.
    • Мы обновили основной цикл, чтобы он показывал номер итерации, наглядно демонстрируя активность скрипта.
  3. Сохраните файл после внесения изменений.

  4. Снова запустите скрипт и протестируйте его, нажав Ctrl+C:

    ~/project/trap_example.sh

    При прерывании скрипта вы увидите новые сообщения из функции cleanup_and_exit, что демонстрирует контролируемое завершение работы.

Резюме

В этой лабораторной работе вы научились использовать команду trap в Bash-скриптах. Вы создали скрипт, который перехватывает определенные сигналы и выполняет заданные действия при их получении. Вы изучили различные способы применения trap, включая использование встроенных команд и функций.

Команда trap является мощным инструментом для обработки прерываний и выполнения действий по очистке в ваших Bash-скриптах. Она позволяет создавать более надежные и удобные консольные приложения, корректно обрабатывая неожиданные завершения и прерывания пользователем.

Помните, что умение обрабатывать сигналы критически важно во многих сценариях автоматизации, например, для обеспечения удаления временных файлов, закрытия сетевых соединений или сохранения состояния перед внезапным выходом из скрипта.