Sieht so aus, weil der Befehl länger als eine Minute dauert, sodass sich die Befehle so lange anhäufen, bis Ihr System keine Ressourcen mehr hat.
Sie können sicherstellen, dass nur eine Instanz davon ausgeführt wird, rsync
indem Sie eine Sperrdatei verwenden. util-linux
enthält einen Wrapper für Dateisperren flock
, den Sie wie folgt in Ihrer Crontab verwenden können:
* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path user@x.x.x.x:/remote_path' > /dev/null
Im obigen Beispiel lautet der Sperrdateipfad /tmp/example.lock
, Sie können ihn jedoch als alles vernünftig festlegen. -n
verhindert das flock
Anhäufen von Befehlen, da sie sofort beendet wird, anstatt zu warten, bis die Sperre freigegeben wird.
Alternativ können Sie auch verhindern, dass sich Ihr Cron-Befehl anhäuft, indem Sie ein Skript mit einer recht einfachen Sperre erstellen, die sicherstellt, dass jeweils nur eine Instanz des Skripts ausgeführt werden kann:
#!/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"
Sperrmechanismus inspiriert durch Verhindern doppelter Cron-Job-Ausführungen von Benjamin Cane
Beachten Sie, dass die Haupteinschränkung im Skript darin liegt, dass die PID-Datei aus irgendeinem Grund nicht entfernt wird und ein anderer Prozess dieselbe PID hat. Das Skript wird fälschlicherweise beendet.
Speichern Sie dieses Skript irgendwo wie in /usr/local/bin/example.sh
, chmod +x /usr/local/bin/example.sh
und rufen Sie es dann von Ihrer Crontab wie folgt auf:
* * * * * /usr/local/bin/example.sh > /dev/null