1

У меня есть задание cron, которое запускает команду rsync, которая выполняет удаленное резервное копирование каждые два часа.

Если предыдущее удаленное резервное копирование все еще выполняется, я инкапсулировал эту команду rysnc внутри команды flock.

Flock предотвращает одновременное выполнение этой команды несколько раз:

flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ remoteuser@55.55.55.55:/home/remoteuser/backupFolder'  || echo "Couldn't perform remote backup, because previous remote backup is still in progress."

Однако, если я перезагружаю удаленный сервер во время одной из этих резервных копий (для имитации сценария разорванного соединения), flock продолжает блокировать будущие попытки, потому что предыдущий процесс (хотя он постоянно отключен от места назначения резервной копии) сохраняется.

Какой лучший способ сообщить стаду, что rsync потерпел неудачу на неопределенный срок, и, следовательно, освободить эти блокировки, которые мешают будущим попыткам начать работу?

На странице руководства rsync я вижу аргумент --timeout. Является ли установка наилучшим способом борьбы с круглосуточными замками стада?

1 ответ1

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

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

Поскольку вам нужно отслеживать процессы как на локальных, так и на удаленных машинах, я не думаю, что система блокировки файлов будет работать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .