Похоже, это потому, что выполнение команды занимает больше минуты, поэтому команды накапливаются до тех пор, пока ваша система не будет нуждаться в ресурсах.
Вы можете убедиться, что только один экземпляр этого rsync
запускается с помощью файла блокировки. util-linux
включает в себя упаковщик блокировки файлов flock
, который вы можете использовать в вашем crontab следующим образом:
* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path user@x.x.x.x:/remote_path' > /dev/null
В приведенном выше примере путь к файлу блокировки есть /tmp/example.lock
, но вы можете установить для него что-нибудь разумное. -n
будет препятствовать тому, чтобы flock
команды накапливались, потому что он выйдет немедленно, а не будет ждать продолжения снятия блокировки.
Кроме того, вы также можете предотвратить накопление команды cron, создав скрипт с довольно простой блокировкой, которая гарантирует, что одновременно может выполняться только один экземпляр скрипта:
#!/bin/bash PIDFILE=/tmp/example.pid if [ -f "$PIDFILE" ] then PID="$(cat "$PIDFILE")" ps -p $PID > /dev/zero 2>&1 if [ $? -eq 0 ] then echo "Instance of this script is still running as PID $PID" exit 1 fi fi echo $$ > $PIDFILE if [ $? -ne 0 ] then echo "Could not create PID file: $PIDFILE" exit 1 fi # YOUR CODE GOES BELOW rsync -az /local_path user@x.x.x.x:/remote_path # YOUR CODE GOES ABOVE rm -f "$PIDFILE"
Механизм блокировки, вдохновленный предотвращением повторных выполнений заданий cron Бенджамином Кейном
Обратите внимание, что основным ограничением в сценарии является то, что если файл PID по какой-либо причине не удален и другой процесс имеет такой же PID, сценарий будет ошибочно завершен.
Сохраните этот скрипт где-нибудь, например, в /usr/local/bin/example.sh
, chmod +x /usr/local/bin/example.sh
и затем вызовите его из вашего crontab следующим образом:
* * * * * /usr/local/bin/example.sh > /dev/null