Вопрос или проблема
ОСНОВАНИЕ:
Я пытался обновить свой планшет на Android с различными версиями этого скрипта, и даже прежде чем я решил реализовать именно этот скрипт, я пытался сделать это в течение довольно долгого времени, но пока что не имел полного успеха. Это почти сделано.
Моя среда пользовательского пространства Termux Linux несколько устарела. Я старался правильно настроить свою систему, но есть аномалии и несоответствия. Я просто обучался и учился на ходу.
При выполнении более ранних версий этого скрипта он постоянно заполнял память моей microSD, хотя должно было быть более чем достаточно места. Резервные директории были в сотни раз больше оригинальных исходных директорий. Я понял, что это бесконечные циклы, вызванные вложенными символическими ссылками и, вероятно, другими причинами, которые я еще не выявил. Это причина структуры скрипта и избыточного логирования.
Проблем немного (надеюсь):
- Вирусная неограниченная переменная в массиве backup_files. Мне просто не удалось это исправить, и я не знаю, почему.
- У меня было много проблем с завершением всех запущенных процессов. Некоторые из них были очень хитрыми. Отсюда и KILLSWITCH. Но я просто не могу заставить это работать, и я не знаю, почему.
Буду признателен за любую помощь, чтобы довести это до ума.
Ответ или решение
К сожалению, я не могу получить доступ к внешним ссылкам, включая pastebin.com
, но я могу помочь вам с общими принципами исправления вашего скрипта резервного копирования Bash и решения проблем, которые вы описали.
Основные проблемы:
-
Проблема с бесконечными переменными в массиве
backup_files
:
Это может быть вызвано неправильным использованием циклов или условиями, которые позволяют добавлять элементы в массив бесконечно. Чтобы устранить эту проблему, вам следует проверить, как именно вы заполняете массивbackup_files
и убедиться, что используете правильные конструкции для их управления. Например:backup_files=() for file in /path/to/source/*; do if [ ! -L "$file" ]; then # Пропускаем символические ссылки backup_files+=("$file") fi done
Также убедитесь, что ваша логика не приводит к бесконечным циклам, где массив может заполняться повторно.
-
Проблема с завершением всех запущенных процессов:
Для того чтобы корректно управлять процессами и завершать их, вы можете использовать функцию для обработки SIGINT (обычно это Ctrl+C). Вы можете создать "KILLSWITCH" следующим образом:trap 'kill $(jobs -p)' SIGINT
Эта строка заставляет ваш скрипт завершить все фоновые задания при получении сигнала SIGINT. Вы также можете добавить дополнительные условия, чтобы обеспечить завершение любых других процессов, которые могут быть открыты во время выполнения вашего скрипта.
Основной шаблон скрипта резервного копирования
Вот пример базового шаблона для резервного копирования с учетом вышеуказанных рекомендаций:
#!/bin/bash
# Устанавливаем начальные условия
source_dir="/path/to/source"
backup_dir="/path/to/backup"
backup_files=()
# Обработка SIGINT для корректного завершения
trap 'kill $(jobs -p)' SIGINT
# Получаем список файлов для резервного копирования
for file in "$source_dir"/*; do
if [ ! -L "$file" ]; then
backup_files+=("$file") # Добавляем в массив
fi
done
# Выполняем резервное копирование
for file in "${backup_files[@]}"; do
cp -r "$file" "$backup_dir" # Копируем файл
done
echo "Резервное копирование завершено."
Рекомендации по отладке:
-
Используйте логи: Добавьте в скрипт отладочные сообщения для отслеживания того, где он может зависнуть или крутиться в бесконечном цикле. Например:
echo "Копирую $file..."
-
Проверка на символические ссылки: Как вы уже заметили, символические ссылки могут создавать проблемы. Убедитесь, что вы их правильно обрабатываете.
-
Мониторинг использования памяти: Используйте
df -h
для проверки свободного пространства на вашем жестком диске. Возможно, проблема в том, что резервные копии превышают допустимый размер.
Надеюсь, это поможет вам решить проблемы с вашим скриптом резервного копирования. Если у вас есть конкретные участки кода, которые вы хотели бы обсудить, предоставьте их, и я помогу вам с анализом и исправлениями.