Parece que isso ocorre porque o comando leva mais de um minuto para ser executado, por isso os comandos se acumulam até que o sistema fique sem recursos.
Você pode garantir que apenas uma instância desse rsync
seja executada usando um arquivo de bloqueio. util-linux
inclui um wrapper de bloqueio de arquivos chamado flock
, que você pode usar no seu crontab assim:
* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path [email protected]:/remote_path' > /dev/null
No exemplo acima, o caminho do arquivo de bloqueio é /tmp/example.lock
, mas você pode defini-lo como algo sensato. -n
impedirá que os comandos flock
se acumulem, porque ele sairá imediatamente, em vez de esperar que o bloqueio seja liberado para continuar.
Alternativamente, você também pode evitar que o seu comando cron se acumule, fazendo um script com um bloqueio razoavelmente simples que garanta que apenas uma instância do script possa estar sendo executada por vez:
#!/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 [email protected]:/remote_path
# YOUR CODE GOES ABOVE
rm -f "$PIDFILE"
Mecanismo de bloqueio inspirado em Impedindo execuções duplicadas de tarefas cron por Benjamin Cane
Note que a principal limitação do script é se o arquivo PID não for removido por qualquer razão e outro processo tiver o mesmo PID, o script erroneamente será encerrado.
Salve esse script em algum lugar, como em /usr/local/bin/example.sh
, chmod +x /usr/local/bin/example.sh
e, em seguida, chame-o do seu crontab assim:
* * * * * /usr/local/bin/example.sh > /dev/null