Linux Server Deployment & SSH Mastery · Урок

Обработка ошибок и ведение журналов в сценариях

Реализуйте надёжную обработку ошибок, перенаправляйте вывод сценариев и создавайте информативные журналы для контроля выполнения сценариев и устранения проблем.

Урок 3 из 411 шагов

«Обработка ошибок и ведение журналов в сценариях» — бесплатный урок Linux Server Deployment & SSH Mastery на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Linux Server Deployment & SSH Mastery, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Linux Server Deployment & SSH Mastery содержит 4 уроков всего.

Сделайте свои скрипты надёжными

Представьте, что Ваш скрипт работает на сервере и выполняет важную задачу. Что произойдёт, если что-то пойдёт не так?

  • Он завершится без каких-либо сообщений?
  • После него останется беспорядок?
  • Сможете ли Вы понять, когда и почему произошёл сбой?

Надёжные скрипты корректно обрабатывают ошибки и создают понятные журналы. В этом уроке Вы научитесь это делать!

Понимание кодов завершения

Каждая команда и каждый скрипт в Linux после завершения возвращают код завершения (или статус завершения). Это число показывает, успешно ли они выполнились.

  • 0: успешное выполнение! Всё прошло хорошо.
  • 1-255: ошибка выполнения. Конкретное число может указывать на тип ошибки.

Посмотрим, как это работает:

#!/bin/bash
# This script demonstrates exit codes

echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"

echo

echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"

Проверка состояния команды

После выполнения любой команды Вы можете проверить её код завершения с помощью специальной переменной $?. Это очень полезно для принятия решений в скрипте.

Для реакции на успешное выполнение или ошибку можно использовать оператор if:

#!/bin/bash
# Check if a file exists before trying to read it

FILENAME="test_file.txt"
touch $FILENAME # Create it for success case

if [ -f "$FILENAME" ]; then
  echo "File '$FILENAME' exists. Processing..."
  # ... do something with the file ...
  rm $FILENAME # Clean up
else
  echo "Error: File '$FILENAME' not found!"
  exit 1
fi

echo "Script finished."

`set -e`: завершение при ошибке

В простых скриптах постоянная ручная проверка $? может быть утомительной. Команда set -e изменяет поведение скрипта:

  • Если любая команда завершается с ненулевым статусом (происходит ошибка), скрипт немедленно завершается.
  • Это не позволяет скрипту продолжить работу с потенциально повреждёнными данными или в недопустимом состоянии.

Попробуйте выполнить этот скрипт. Что произойдёт, если команда cp завершится с ошибкой?

#!/bin/bash
set -e

echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail

echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."

`trap` для очистки

Иногда даже после сбоя скрипта необходимо выполнить очистку, например удалить временные файлы. Команда trap позволяет перехватывать сигналы (например, сигнал завершения или ошибки) и выполнять команду.

  • EXIT: выполняется при завершении скрипта независимо от успеха или ошибки.
  • ERR: выполняется, если команда завершается с ненулевым статусом (когда активна команда set -e).

В этом примере мы гарантируем удаление временного каталога:

#!/bin/bash

TEMP_DIR="/tmp/my_script_temp_$(date +%s)"

function cleanup {
  echo "Cleaning up temporary directory: $TEMP_DIR"
  rm -rf "$TEMP_DIR"
}

trap cleanup EXIT

mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure

echo "Script completed."

Перенаправление вывода

Во время работы скрипт часто выводит сообщения. Они бывают двух основных типов:

  • Стандартный вывод (stdout): обычные сообщения (дескриптор файла 1).
  • Стандартный поток ошибок (stderr): сообщения об ошибках (дескриптор файла 2).

Эти потоки можно перенаправить в файлы вместо вывода на экран:

  • command > file: перенаправляет stdout в file.
  • command 2> file: перенаправляет stderr в file.

Сохраним сообщения об успешном выполнении и ошибках отдельно.

#!/bin/bash
# Redirect stdout to success.log and stderr to error.log

echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log

echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.log

Весь вывод в один файл

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

  • command > file 2>&1: перенаправляет stdout в file, а затем перенаправляет stderr туда же, куда направлен stdout (в файл).
  • command &> file: более короткий и современный синтаксис для того же действия.

Это отлично подходит для создания полного журнала выполнения скрипта.

#!/bin/bash
# Redirect both stdout and stderr to a single log file

LOG_FILE="combined_script.log"

echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"

echo "Check the '$LOG_FILE' file for all output."

Добавление временных меток в журналы

При отладке крайне важно знать, когда произошло событие. Временные метки делают записи журнала гораздо полезнее.

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

#!/bin/bash

LOG_FILE="timestamped_script.log"

function log_message {
  echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}

log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."

echo "Check '$LOG_FILE' for timestamped entries."

Отправка в системные журналы с помощью `logger`

Для важных событий может потребоваться отправлять сообщения непосредственно в системную службу ведения журналов (syslog). Именно это делает команда logger.

  • Системными журналами часто управляют такие средства, как journalctl (в системах с systemd).
  • Это объединяет важные сообщения скрипта с другими системными событиями.
  • Такой подход полезен для критических ошибок и аудиторских следов.

Сообщения, отправленные с помощью logger, можно найти, используя journalctl -f или tail -f /var/log/syslog (в зависимости от системы).

#!/bin/bash
# Send a message to system logs

SCRIPT_NAME="MyBackupScript"

logger -t "$SCRIPT_NAME" "Starting daily backup operation."

# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
  logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
  logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi

echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."

Проверка обработки ошибок

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

Какие две команды Bash Вы в первую очередь использовали бы для этого?

Итоги и дальнейшие шаги

Вы узнали, как сделать скрипты Bash более надёжными и упростить их отладку!

  • Коды завершения: понимание успешного выполнения и ошибок команд.
  • set -e: автоматическое завершение при ошибке.
  • trap: выполнение очистки при завершении скрипта.
  • Перенаправление вывода: управление направлением stdout и stderr.
  • Временные метки: добавление контекста в журналы.
  • logger: интеграция с общесистемным ведением журналов.

Применяя эти методы, Вы сделаете автоматизированные задачи более надёжными и управляемыми. Продолжайте практиковаться, чтобы создавать по-настоящему устойчивую автоматизацию!

Можно начать бесплатно

Изучай Linux Server Deployment & SSH Mastery с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
12
Уроки
48

Часто задаваемые вопросы

Урок «Обработка ошибок и ведение журналов в сценариях» бесплатный?

Да — полный текст урока «Обработка ошибок и ведение журналов в сценариях» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Linux Server Deployment & SSH Mastery, подпишись на CoddyKit PRO. Курс Linux Server Deployment & SSH Mastery содержит 4 уроков всего.

Чему я научусь в уроке «Обработка ошибок и ведение журналов в сценариях»?

Реализуйте надёжную обработку ошибок, перенаправляйте вывод сценариев и создавайте информативные журналы для контроля выполнения сценариев и устранения проблем. Ты практикуешь Linux Server Deployment & SSH Mastery с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Linux Server Deployment & SSH Mastery?

Предыдущий опыт не требуется. Linux Server Deployment & SSH Mastery на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Обработка ошибок и ведение журналов в сценариях»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Linux Server Deployment & SSH Mastery?

Да. Каждый урок Linux Server Deployment & SSH Mastery включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Введение в написание сценариев Bash
  2. Автоматизация задач сервера
  3. Обработка ошибок и ведение журналов в сценариях
  4. Функции, аргументы и повторно используемые скрипты
← Назад к Linux Server Deployment & SSH Mastery