При создании сложных Bash-скриптов иногда требуется, чтобы они могли восстанавливать выполнение после прерываний. Это особенно актуально для долгих процессов, например, обработки файлов, миграции данных или массовой загрузки.
В чем идея:
Сохранение состояния: фиксируем завершённые этапы в отдельном файле.
Проверка состояния: перед выполнением этапа проверяем, был ли он выполнен ранее.
Возобновление: пропускаем выполненные этапы, начиная с незавершённых.
Пример: обработка списка файлов. Допустим, у нас есть список файлов для обработки:
#!/bin/bash
# Список файлов для обработки
FILES=("file1.txt" "file2.txt" "file3.txt")
# Файл состояния
STATE_FILE="process.state"
# Функция для обновления состояния
update_state() {
echo "$1" >> "$STATE_FILE"
}
# Создаём файл состояния, если его нет
if [[ ! -f "$STATE_FILE" ]]; then
> "$STATE_FILE"
fi
# Загружаем выполненные этапы
COMPLETED=$(cat "$STATE_FILE")
echo "Начинаем обработку файлов..."
for FILE in "${FILES[@]}"; do
# Проверяем, был ли файл уже обработан
if echo "$COMPLETED" | grep -q "$FILE"; then
echo "[Пропуск] $FILE уже обработан."
continue
fi
# Обрабатываем файл
echo "Обрабатываем $FILE..."
sleep 2 # Имитация длительной работы
# Если успешно, обновляем состояние
update_state "$FILE"
echo "[Готово] $FILE обработан."
done
echo "Все файлы обработаны!"
Вывод скрипта. Первый запуск:
Начинаем обработку файлов...
Обрабатываем file1.txt...
[Готово] file1.txt обработан.
Обрабатываем file2.txt...
[Готово] file2.txt обработан.
Обрабатываем file3.txt...
[Готово] file3.txt обработан.
Все файлы обработаны!
Повторный запуск:
Начинаем обработку файлов...
[Пропуск] file1.txt уже обработан.
[Пропуск] file2.txt уже обработан.
[Пропуск] file3.txt уже обработан.
Все файлы обработаны!
Где это может применимо:
Массовая обработка данных (например, логов).
Резервное копирование с пропуском уже сохранённых файлов.
Миграция больших объёмов данных.
Загрузка или выгрузка информации с сетевых хранилищ.
BashTex 📱 #bash