GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Lassen Sie einen Cronjob warten, bis der vorherige Rsync-Job beendet ist

Lösung 1:

Sie können eine Art Sperre implementieren. Dies gibt die Anzahl der noch laufenden rsync-Prozesse aus:

pgrep -cx rsync

Und dies wird den rsync nur ausführen, wenn kein anderer rsync-Prozess existiert:

pgrep -cx rsync || rsync ...

Mit -x verhindert, dass versehentlich unerwünschte Namen abgeglichen werden (zum Beispiel "foobarsync hronizator" oder "not_an_rsync _totally" - es funktioniert genauso wie pgrep -c ^rsync$ )

Lösung 2:

Sie können den Flock-Befehl verwenden, um dies zu tun, z. In diesem Fall flock -n ist wahrscheinlich das, was Sie wollen, da es einen sofortigen Fehler des Befehls verursacht, wenn er die Sperre nicht erhalten kann, z. B.

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

Lösung 3:

Hier ist, was ich tun würde. Erstellen Sie ein Wrapper-Skript um rsync herum, um eine Sperrdatei zu erstellen.

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

Lösung 4:

Wenn Sie bereit sind, andere Tools in Betracht zu ziehen, können Sie sich auch rdiff-backup ansehen. Es verwendet librsync, um Sicherungen durchzuführen, und speichert eine konfigurierbare Anzahl von Deltas/Inkrementen. Es sperrt auch, so dass nur ein rdiff-Backup-Prozess zu einem bestimmten Zeitpunkt ausgeführt werden kann.

Lösung 5:

Meine Antwort ist in etwa dieselbe, die Mike gesagt hat.

In das Skript sollten Sie etwa Folgendes einfügen:

  • eine Sperrdatei erstellen
  • Überprüfen Sie die Existenz der Sperrdatei, wenn Sie sie das nächste Mal ausführen.

Aber es gibt eine sehr wichtige Sache, die Sie tun sollten. und das, um ein Trap-System zu implementieren.

Also, was Sie damit tun können, ist, dass Sie, selbst wenn Ihr Skript irgendwie getötet wird oder jemand es getötet hat, dieses Signal abfangen und die Sperrdatei entfernen können, sodass Sie keine veraltete Sperrdatei haben.

Wie Sie das umsetzen, können Sie hier nachlesen.

Nur eine Kleinigkeit, Sie können Signal 9 nicht abfangen, ich meine, wenn jemand kill -9 macht , können Sie das nicht abfangen, da dieses Signal direkt mit dem Kernel interagiert und es keine Möglichkeit gibt, das abzufangen.

Außerdem müssen Sie, wie von John vorgeschlagen, die Sperrdatei bei jedem Neustart Ihres Systems entfernen, nur um sicherzustellen, dass keine veraltete Datei mehr vorhanden ist.

Das können Sie ganz einfach tun, indem Sie ein kleines rm -f <FILE> setzen Befehl in /etc/rc.local


Linux
  1. Intelligentere Dateiübertragungen als Rsync??

  2. Warten Sie, bis der Download mehrerer Dateien abgeschlossen ist?

  3. Fledermausdatei überall für das Terminal verfügbar machen?

  4. So verwenden Sie Beispiele für C-Mutex-Sperren für die Linux-Thread-Synchronisierung

  5. Wie macht man eine Datei spärlich?

ls-Befehl in Linux zum Auflisten von Dateien

Wie man eine Datei unter Linux ausführbar macht

Wie erstellen Sie eine Liste/Datei, aus der Pacman installiert werden kann?

Fortsetzen der Übertragung einer einzelnen Datei durch rsync

eine Logdatei erstellen

Kann ein Shell-Skript darauf warten, dass sich eine Datei ändert, und Maßnahmen ergreifen?