
У меня есть задание cron, которое запускает команду rsync, которая делает удаленное резервное копирование каждые два часа.
На случай, если предыдущее удаленное резервное копирование все еще выполняется, я инкапсулировал эту команду rysnc внутри команды flock.
Flock предотвращает многократное одновременное выполнение этой команды:
flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ [email protected]:/home/remoteuser/backupFolder' || echo "Couldn't perform remote backup, because previous remote backup is still in progress."
Однако если я перезагружу удаленный сервер во время одного из таких резервных копий (чтобы имитировать ситуацию с разрывом соединения), Flock продолжит блокировать будущие попытки, поскольку предыдущий процесс (хотя и постоянно отключенный от места назначения резервной копии) сохраняется.
Каков наилучший способ сообщить Flock о том, что rsync не удалось выполнить, и, следовательно, снять блокировки, которые мешают запуску будущих попыток?
На странице руководства rsync я вижу аргумент --timeout. Является ли его установка лучшим способом справиться с круглосуточными блокировками flock?
решение1
Это не ответ на ваш вопрос, flock
но может помочь, несмотря ни на что. Некоторое время назад был похожий вопрос о стратегиях резервного копирования, и мне понравилосьмой ответдостаточно, чтобы реализовать это самостоятельно.
Основная идея заключается в том, чтобы ваш скрипт резервного копирования создавал файл в месте назначения резервного копирования, когда он завершается, и удалял файл, как только он начинает выполняться. Затем вы заставляете свой скрипт проверять существование файла и разрешать ему выполняться только в том случае, если файл существует:
#!/usr/bin/env bash
## Make sure no backup is currently running
if [ ! -e /path/to/backup/backup_finished.txt ]; then
echo "A backup seems to be running, or did not finish correctly, exiting." &&
exit;
fi
## Delete the file from the remote server
ssh user@remote rm /path/to/backup/backup_finished.txt
## Do da rsync
rsync /path/to/source/ user@remote:/path/to/daily/backup/
## Create the file on the remote server
ssh user@remote touch /path/to/backup/backup_finished.txt
Это гораздо более упрощенный подход, чем ваш, но у него есть преимущество в том, что я могу поймать (хотя и не справиться с ними каким-либо изящным образом) незавершенные резервные копии. Вы можете расширить это, чтобы проверить, действительно ли выполняется резервная копия или старая не завершилась чисто, и отреагировать соответствующим образом.
Поскольку вам необходимо отслеживать процессы как на локальной, так и на удаленной машине, я не думаю, что система файлов блокировки будет работать.