Rsync cronjob, который будет работать только в том случае, если rsync еще не запущен
Я проверил решение здесь, но не могу найти его. Я имею дело с очень медленным соединением wan около 300kb/sec. Для моих загрузок я использую удаленный ящик, а затем я загружаю их в свой дом. Я пытаюсь запустить cronjob, который будет rsync два каталога на моем удаленном и локальном сервере каждый час. У меня все работает, но если есть много данных для переноса перекрытия rsyncs и в итоге создается два экземпляра одного и того же файла, чтобы дублировать отправленные данные.
Я хочу вместо этого вызвать script, который будет запускать мою команду rsync, но только если rsync не запущен?
Ответы
Ответ 1
Через script вы можете создать файл "lock". Если файл существует, cronjob должен пропустить прогон; иначе это должно продолжаться. После завершения script он должен удалить файл блокировки.
if [ -e /home/myhomedir/rsyncjob.lock ]
then
echo "Rsync job already running...exiting"
exit
fi
touch /home/myhomedir/rsyncjob.lock
#your code in here
#delete lock file at end of your job
rm /home/myhomedir/rsyncjob.lock
Ответ 2
Проблема с созданием файла "блокировки", как предложено в предыдущем решении, заключается в том, что файл блокировки может уже существовать, если script отвечает за его удаление с ошибкой.
Например, это может произойти, если пользователь завершит процесс rsync или из-за отключения питания. Вместо этого следует использовать flock
, который не страдает от этой проблемы.
Как бы то ни было, flock также прост в использовании, поэтому решение будет выглядеть следующим образом:
flock -n lock_file -c "rsync ..."
Команда после опции -c
выполняется только в том случае, если в файле lock_file нет другой блокировки процесса. Если процесс блокировки по какой-либо причине завершается, блокировка будет выпущена в файле lock_file. Опции -n
говорят, что стая должна быть неблокирующей, поэтому, если есть другие процессы, блокирующие файл, ничего не произойдет.
Ответ 3
Простое решение без использования файла блокировки - это просто:
pgrep rsync > /dev/null || rsync -avz ...
Это будет работать, пока это единственное задание rsync, которое вы запускаете на сервере, и вы можете запустить его непосредственно в cron, но вам нужно будет перенаправить вывод в файл журнала.
Если вы выполняете несколько заданий rsync, вы можете заставить pgrep соответствовать полной командной строке с таким шаблоном:
pgrep -f rsync.*/data > /dev/null || rsync -avz --delete /data/ otherhost:/data/
pgrep -f rsync.*/www > /dev/null || rsync -avz --delete /var/www/ otherhost:/var/www/
Ответ 4
Чтобы использовать пример файла блокировки, заданный с помощью @User выше, следует использовать ловушку, чтобы убедиться, что файл блокировки удален, когда script завершена по какой-либо причине.
if [ -e /home/myhomedir/rsyncjob.lock ]
then
echo "Rsync job already running...exiting"
exit
fi
touch /home/myhomedir/rsyncjob.lock
#delete lock file at end of your job
trap 'rm /home/myhomedir/rsyncjob.lock' EXIT
#your code in here
Таким образом, файл блокировки будет удален, даже если script завершается до конца script.