
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 rsync
Ihnen 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=NAME
nur 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 rsync
und zählen die Anzahl der Zeilenumbrüche in der Zeichenfolge.
Ich denke, dass diese Antwort eine gute Möglichkeit zum Sammeln der Ausgabe java
bietet, habe es aber nicht ausprobiert:https://stackoverflow.com/a/9048519/5484716
TunnichtVerwenden Sie redirectErrorStream
die 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 --info
Flag on rsync
gibt den Pfad jeder übertragenen Datei aus. Der Exit-Code von rsync
zeigt 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 rsync
Befehl direkt zu verwenden. Dadurch rsync
werden wahrscheinlich am Anfang und am Ende der Übertragung einige weitere Textzeilen ausgegeben, sodass Sie die if
Anweisung 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 rsync
das 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.