Похоже, это потому, что выполнение команды занимает больше минуты, поэтому команды накапливаются до тех пор, пока ваша система не будет нуждаться в ресурсах.
Вы можете убедиться, что только один экземпляр этого 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