0

プロセスが次を使用してデータを生成するときに、リモートサーバーからデータをプルする簡単なスクリプトがありますrsync

while :
do
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./

    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./

    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./

    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./

    sleep 900 #wait 15 minutes, try again
done

ファイルがない場合は、rsync終了ステータス 12 を返します (明らかに)。上記の呼び出しでデータが見つからない場合rsyncは、ループから抜けたいと思います (データを生成するプロセスはおそらく終了しました)。混乱を避けるために、プロセスの 1 つでも成功した場合にループから抜け出したくありません。rsync

bashでそれを行う簡潔な方法はありますか?

4

3 に答える 3

2

戻り値を合計すると、すべて 12 が返された場合、合計は 48 になります。

while :
do
    rc=0
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
    let rc+=$?

    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
    let rc+=$?

    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
    let rc+=$?

    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
    let rc+=$?

    if [[ $rc == 48 ]]; then  # 48 = 4 * 12
         break;
    fi

    sleep 900 #wait 15 minutes, try again
done

戻りコードの合計が 48 になる別の組み合わせ (つまり、0 + 0 + 12 + 36) を取得すると、これが問題になる可能性があることに注意してください。

于 2012-10-19T19:11:12.117 に答える
0

この方法では、ファイルがないために失敗した回数をカウントします。

while :
do
    nofile=0

    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
    (( $? == 12 )) && let nofile++

    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
    (( $? == 12 )) && let nofile++

    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
    (( $? == 12 )) && let nofile++

    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
    (( $? == 12 )) && let nofile++

    # if all failed due to "no files", break the loop
    if (( $nofile == 4 )); then break; fi

    sleep 900 #wait 15 minutes, try again
done
于 2012-10-20T00:20:43.573 に答える