Обработка ошибок и ведение журналов в сценариях
Реализуйте надёжную обработку ошибок, перенаправляйте вывод сценариев и создавайте информативные журналы для контроля выполнения сценариев и устранения проблем.
«Обработка ошибок и ведение журналов в сценариях» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Введение в написание сценариев Bash
- Автоматизация задач сервера
- Обработка ошибок и ведение журналов в сценариях
- Функции, аргументы и повторно используемые скрипты