Подтвердить что ты не робот

Rsync cronjob, который будет работать только в том случае, если rsync еще не запущен

Я проверил решение здесь, но не могу найти его. Я имею дело с очень медленным соединением wan около 300kb/sec. Для моих загрузок я использую удаленный ящик, а затем я загружаю их в свой дом. Я пытаюсь запустить cronjob, который будет rsync два каталога на моем удаленном и локальном сервере каждый час. У меня все работает, но если есть много данных для переноса перекрытия rsyncs и в итоге создается два экземпляра одного и того же файла, чтобы дублировать отправленные данные.

Я хочу вместо этого вызвать script, который будет запускать мою команду rsync, но только если rsync не запущен?

4b9b3361

Ответ 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.