On dirait que c'est parce que l'exécution de la commande prend plus d'une minute. Par conséquent, les commandes s'accumulent jusqu'à ce que votre système manque de ressources.
Vous pouvez vous assurer que seule une instance de celle-ci rsync
s'exécute à l'aide d'un fichier de verrouillage. util-linux
inclut un wrapper de verrouillage de fichier appelé flock
, que vous pouvez utiliser dans votre crontab comme ceci:
* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path user@x.x.x.x:/remote_path' > /dev/null
Dans l'exemple ci-dessus, le chemin du fichier de verrouillage est /tmp/example.lock
, mais vous pouvez le définir comme étant raisonnable. -n
empêchera les flock
commandes de s’empiler car elle se fermera immédiatement au lieu d’attendre que le verrou soit libéré pour continuer.
Alternativement, vous pouvez également empêcher votre commande cron de s’empiler en créant un script avec un verrou assez simple garantissant qu’une seule instance du script puisse être exécutée à la fois:
#!/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"
Mécanisme de verrouillage inspiré par la prévention des exécutions de tâches cron en double par Benjamin Cane
Notez que la principale limitation du script est que si le fichier PID n'est pas supprimé pour une raison quelconque et qu'un autre processus a le même PID, le script se ferme par erreur.
Enregistrez ce script quelque part, comme dans /usr/local/bin/example.sh
, chmod +x /usr/local/bin/example.sh
puis appelez-le depuis votre crontab comme ceci:
* * * * * /usr/local/bin/example.sh > /dev/null