Назад | Перейти на главную страницу

Может ли команда rm завершиться в сценарии bash до того, как все файлы будут удалены?

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

Вот сценарий:

#!/bin/bash

mount /mnt/backups

while [ ! -d /mnt/backups/dailyBackup-0 ]
do
        echo "Backup mount not present, sleeping..."
        sleep 30
done

rm -r /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-1 /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-0 /mnt/backups/dailyBackup-1

dirname="/mnt/backups/dailyBackup-0"
mkdir $dirname

cd /
rsync -qr --stats root etc var $dirname

umount /mnt/backups

Хотя в большинстве случаев это нормально, я иногда получаю следующее: похоже, dailyBackup-1 перемещается до того, как dailyBackup-2 закончил удаление. Если это то, что происходит, как лучше всего это предотвратить?

/mnt/backups/dailyBackup-0:
total 0
drwxrwxrwx 1 root root 0 2010-12-07 03:27 var
drwxrwxrwx 1 root root 0 2010-12-07 02:39 root
drwxrwxrwx 1 root root 0 2010-12-07 02:38 etc

/mnt/backups/dailyBackup-1:
total 0
drwxrwxrwx 1 root root 0 2010-12-06 03:26 var
drwxrwxrwx 1 root root 0 2010-12-06 02:32 root
drwxrwxrwx 1 root root 0 2010-12-06 02:32 etc

/mnt/backups/dailyBackup-2:
total 0
drwxrwxrwx 1 root root 0 2010-12-07 02:36 var
drwxrwxrwx 1 root root 0 2010-12-05 03:21 dailyBackup-1

проблема скорее всего в том, что rm терпит неудачуобратите внимание, что var все еще присутствует в dailyBackup-2, скорее всего, потому, что какой-то файл там не может быть удален.

в качестве общего примечания о написании сценариев оболочки управления системой:

а) всегда проверяйте вывод (ошибки) ваших скриптов, вы автоматически получите его по почте от cronjobs, если ваша настройка электронной почты не нарушена

б) всегда проверяйте, что вы обрабатываете все ошибки, которые могут возникнуть (например, сбой rm или mv). Хорошая идея - поставить set -e поверх вашего скрипта, что заставит оболочку выйти, когда она попадет в первый необработанный ошибка (для отладки также добавьте set -x, который распечатает все выполняемые команды, чтобы вы могли видеть, что делает скрипт)

и чтобы ответить на ваш исходный вопрос: rm никогда не выйдет до удаления всех файлов, или, вернее, до завершения системного вызова unlink () для этого последнего найденного файла. (единственный случай, который я мог представить, где файлы все еще могут быть там после отсоединения, может быть какой-то неясной ошибочной сетевой файловой системой ...), но выход rm не означает, что все файлы были успешно удалены (даже если вы являетесь пользователем root и используете -fr ( вы даже не используете -f)), например, если файлы помечены как неизменяемые в файловых системах ext *, или если файлы были созданы заново во время обхода rm дерева. rm сообщит об этом с сообщением об ошибке и безуспешным возвратом статистики tho '

Попробуйте изменить это

rm -r /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-1 /mnt/backups/dailyBackup-2
mv /mnt/backups/dailyBackup-0 /mnt/backups/dailyBackup-1

так как

rm -r /mnt/backups/dailyBackup-2 &&
mv /mnt/backups/dailyBackup-1 /mnt/backups/dailyBackup-2 &&
mv /mnt/backups/dailyBackup-0 /mnt/backups/dailyBackup-1 &&

поэтому каждая команда будет запускаться только в том случае, если предыдущая завершилась успешно (или, другими словами, вышла со статусом 0).

Доступны ли файлы на другом сервере через монтирование nfs? Если NFS настроен с мягким монтированием, это не гарантирует завершения операций.