Я использую rsync для резервного копирования некоторых данных с одного сервера на другой. Все работает нормально, но это может занять больше времени, в зависимости от того, сколько данных нужно передать.
Есть ли какой-нибудь гарантированный способ гарантировать, что команда rsync не запустится до того, как предыдущая закончила использовать cronjob?
Например, каждый час я запускаю команду rsync, но, возможно, передача занимает более 1 часа, поэтому следующий начинается до того, как завершится предыдущий.
Ответы:
Вы можете реализовать какую-то блокировку. Это напечатает количество процессов rsync, все еще работающих:
И это запустит rsync, только если не существует другого процесса rsync:
Использование
-x
предотвратит случайное сопоставление нежелательных имен (например, «fooba rsync hronizator» или «not_an_ rsync _totally» - это работает так же, какpgrep -c ^rsync$
)источник
Вы можете использовать команду flock, чтобы помочь вам сделать это, например. В этом случае
flock -n
, вероятно, то, что вы хотите, так как это вызовет немедленный сбой команды, если она не может получить блокировку, напримеристочник
/var/run
вместо этого.Если вы готовы рассмотреть другие инструменты, вы также можете взглянуть на rdiff-backup . Он использует librsync для создания резервных копий и сохраняет настраиваемое количество дельт / приращений. Он также блокируется, так что в любой момент времени может быть запущен только один процесс rdiff-backup.
источник
Вот что я сделаю. Создайте сценарий оболочки вокруг rsync для создания файла блокировки.
источник
Мой ответ несколько отличается от того, что сказал Майк.
В сценарии вы должны поместить что-то вроде этого:
Но есть одна очень важная вещь, которую вы должны делать. и чтобы реализовать систему ловушек.
Итак, что вы можете сделать, так это то, что даже если каким-то образом ваш скрипт был убит или кто-то его убил, вы можете перехватить этот сигнал и удалить файл блокировки, чтобы у вас не было устаревшего файла блокировки.
Вы можете прочитать, как реализовать это здесь .
Еще одна маленькая вещь: вы не можете перехватить сигнал 9, я имею в виду, что если кто-то это сделает
kill -9
, вы не можете перехватить его, так как этот сигнал напрямую взаимодействует с ядром, и нет способа отловить это.Кроме того, по предложению Джона, вам нужно удалять файл блокировки при каждой перезагрузке системы, просто чтобы убедиться, что не осталось устаревших файлов.
Это легко сделать, поместив небольшую
rm -f <FILE>
команду в /etc/rc.localисточник
Посмотрите на анакрон (анахроничный хрон) с ключом -s (сериализация). Сериализация гарантирует, что команда больше не будет вызываться, если предыдущая все еще выполняется.
источник
Используйте hatools ( http://www.fatalmind.com/software/hatools/ ), чтобы заблокировать rsync cron в режиме ожидания.
источник
flock(1)
Я не смог заставить решение mgabriel работать на OSX, так как версия pgrep для OSX, по-видимому, не имеет опции -c (я полагаю, это для подсчета). Вместо этого я использовал следующее:
Я использовал ping в качестве примера команды.
Надеюсь это поможет.
источник