Lassen Sie rsync melden, ob lokale Dateien aktualisiert wurden

Lassen Sie rsync melden, ob lokale Dateien aktualisiert wurden

Ich führe rsync aus, um einen Pull von einem Remote-Host zum lokalen Host durchzuführen.

rsync -a --update user@remotehost:/files/ ~/files/

Ich führe diesen Befehl von Java aus und verwende den Exit-Code, um herauszufinden, ob er erfolgreich war oder nicht.

Ist es möglich, diesen Befehl so einzustellen, dass er meldet, ob lokale Dateien geändert wurden? Eine Rückmeldung über einen Exit-Code wäre ideal.

Antwort1

Das lässt sich rsyncIhnen nicht über den Exit-Code mitteilen. Die Exit-Codes haben dokumentierte, vordefinierte Bedeutungen.

Ich denke, die beste Möglichkeit, dies in Java zu tun, besteht darin, die Option hinzuzufügen, --info=NAMEnur aktualisierte Verzeichnis- und Dateinamen anzugeben:

rsync -a --info=NAME --update user@remotehost/files/ ~/files/

Dadurch werden die Namen der aktualisierten Dateien und Verzeichnisse (einen pro Zeile) auf der Standardausgabe ausgedruckt (fd = 0).

Anschließend erfassen Sie die Ausgabe rsyncund zählen die Anzahl der Zeilenumbrüche in der Zeichenfolge.

Ich denke, dass diese Antwort eine gute Möglichkeit zum Sammeln der Ausgabe javabietet, habe es aber nicht ausprobiert:https://stackoverflow.com/a/9048519/5484716

TunnichtVerwenden Sie redirectErrorStreamdie Standardausgabe oder führen Sie sie auf andere Weise mit Standardfehlerströmen zusammen. Wenn Sie dies tun, zählen Sie Fehlermeldungen als aktualisierte Dateien, was nicht das ist, was Sie möchten.

Antwort2

Basierend auf der Idee von @DavidKing, rsync kopierte Dateinamen drucken zu lassen, und erweitert um die Information von @yashma, dass grep einen Exit-Status ungleich Null verlässt, wenn stdin leer war, konnten wir diesen zufriedenstellend kurzen und kryptischen Einzeiler erstellen:

# prints file list, exits nonzero when that list is empty
rsync -a --info=NAME --update user@remotehost:/files/ ~/files/ | grep .

Antwort3

Das --infoFlag on rsyncgibt den Pfad jeder übertragenen Datei aus. Der Exit-Code von rsynczeigt Erfolg/Misserfolg an, sodass Sie es nicht verwenden können, ohne ein Skript um den Befehl zu wickeln, wie

#!/bin/bash

files=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)

if [ $files = "" ]; then
  # files weren't transferred
  exit 0
else
  # files were transferred
  exit 1
fi

und rufen Sie dann dieses Skript aus Java auf, anstatt den rsyncBefehl direkt zu verwenden. Dadurch rsyncwerden wahrscheinlich am Anfang und am Ende der Übertragung einige weitere Textzeilen ausgegeben, sodass Sie die ifAnweisung möglicherweise anpassen müssen, um die zusätzlichen Ausgabezeilen zu berücksichtigen. Die Grundidee würde jedoch funktionieren.

Antwort4

Um die Informationen per Rückgabecode zu erhalten, müsste man ein Shell-Skript schreiben, das rsyncdas Shell-Skript aus Java aufruft und ausführt. Dies bringt einige erhebliche Probleme mit sich, die ich weiter unten darlege. Das Shell-Skript könnte folgendermaßen aussehen:

#!/bin/sh
if OUTPUT=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
then
    if [ "$OUTPUT" != "" ]                   # got output?
    then
        exit 0  # yes, success, "some" files were updated
    fi
fi
exit 1  # either rsync failed or no files were updated

Das Hauptproblem dabei ist, dass Sie nicht feststellen können, ob der Synchronisierungsprozess selbst erfolgreich abgeschlossen wurde. Sie wissen nur, ob Dateien aktualisiert wurden oder nicht. Aus diesem Grund empfehle ich, die Ausgabe in Java zu sammeln und die Zeilen zu zählen.UndÜberprüfen Sie den Rückgabecodein Java.

verwandte Informationen