いくつかのディレクトリをrsyncしています。私はbashターミナルを開いており、次のようなものを実行しています:
for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done
ただし、すべてを停止したい場合は、Ctrlキーを押しながらCキーを押します。これによりrsyncが停止しますが、次のrsyncに進み続けます。この場合、私は何が起こったのかを理解し、問題が再び解決するまで、狂人のようにControl-Cを押します。
これを「修正」する方法はありますか?そのようなループがあり、Control-Cを押すと、bashシェルに戻るようにしたいのです。
for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done
これは、何らかの理由で個々のrsyncの実行が失敗した場合にもループを終了します。
デニスの答えをさらに詳しく説明すると、コードは次のようになります。
trap "echo Exited!; exit;" SIGINT SIGTERM
実際の例(たまたまrsyncが関係している)については、 http://Gist.github.com/279849 を確認してください。
Control-Cのトラップを設定できます。
trap <command> SIGINT
control-Cが押されたときにcommand
を実行します。 trap
ステートメントをスクリプト内のどこかに有効にしたい場所に置くだけです。
Ctrl-Z
スクリプトを一時停止します;kill %%
この答え のクレジット、説明、詳細。
コマンドの文字列を括弧内に入れると、文字列は単一のプロセスとして機能し、SIGINTを受け取り、ヒットすると終了します Ctrl-C:
(for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done)
だが! rsync
コマンドの場合、複数のソースが許可されるため、記述したコードは次のように記述されます。
rsync -a * example.com:somewhere/
簡単に中断できる別のコマンドをループに入れる傾向があります。 2つのctrl-Cを押す必要があります。
for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; sleep 1 ; done
これは、このrsyncの優れたソリューションではありません。おそらく、すぐに実行する必要があります。ただし、次のような他のループではうまく機能します。
while true ; do ping -c 10 example.com ; sleep 1 ; done
このループはループを実行するたびにexample.comのアドレスを再検索します。これは、DNSの変更を監視している場合に役立ちます。