
リモートホストからローカルホストにインポートするためにrsyncを実行しています。
rsync -a --update user@remotehost:/files/ ~/files/
Javaでコマンドを実行し、終了コードを使用してコマンドが成功したことを確認します。
ローカルファイルが変更された場合は、コマンドレポートを再受信できますか?終了コードで報告するのが理想的です。
答え1
rsync
終了コードではこれは不明です。終了コードには、事前定義された意味が文書化されています。
私の考えでは、Javaでこれを行う最善の方法は、更新され--info=NAME
たディレクトリとファイル名のみを参照するオプションを追加することです。
rsync -a --info=NAME --update user@remotehost/files/ ~/files/
これにより、更新されたファイルとディレクトリの名前が1行に1つずつ標準出力(fd = 0)に印刷されます。
次に出力を収集し、rsync
文字列の改行数を計算します。
出力を収集する良い方法はこの答えで見つけることができると思いますjava
が、まだ試していません。https://stackoverflow.com/a/9048519/5484716
するいいえ標準出力と標準エラーストリームを使用するredirectErrorStream
か、別の方法で組み合わせます。これにより、エラーメッセージは更新されたファイルと見なされますが、これは望ましい結果ではありません。
答え2
rsync印刷コピーファイル名を持つ@DavidKingのアイデアに基づいており、stdinが空のときにgrepがゼロ以外の終了状態で終了するという@yashmaの情報を拡張すると、満足できるほど短く不思議な1行の内容を思い出すことができますあります。
# prints file list, exits nonzero when that list is empty
rsync -a --info=NAME --update user@remotehost:/files/ ~/files/ | grep .
答え3
フラグをオン--info
にするとrsync
、転送されたすべてのファイルのパスが出力されます。終了コードはrsync
成功/失敗を示すため、コマンドの周りにスクリプトをラップしない限り使用できません。
#!/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
rsync
次に、コマンドを直接呼び出すのではなく、Javaでスクリプトを呼び出します。rsync
送信の開始と終了に追加のテキスト行がある可能性があるため、追加のif
出力行を考慮してステートメントを調整する必要があるかもしれませんが、デフォルトのアイデアは機能します。
答え4
戻りコードで情報を取得する方法は、シェルスクリプトを作成し、rsync
javaでシェルスクリプトを呼び出して実行することです。以下に要約するように、ここにはいくつかの重要な問題があります。シェルスクリプトは次のとおりです。
#!/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
これの最大の問題は、同期プロセス自体が正常に完了したかどうかがわからないことです。ファイルが更新されたかどうかだけがわかります。したがって、出力を収集し、Javaで行数を数えることをお勧めします。そして戻りコードの確認Javaで。