現在の反復後に実行されているforループを停止します。

現在の反復後に実行されているforループを停止します。

複数のリモートサーバーで時間がかかるプログラムを実行することがよくあります。

for NUM in {1..100}; do ssh host-{NUM}.mydomain.com /usr/bin/takesalongtime; done

ほとんどの場合、バックグラウンドで(つまり、他のタスクの実行中にターミナルエミュレータで)実行されるようにして、完了するまで待ちます。しかし、時にはループを中断し、後で続行するか再実行する必要があります。

sshプロセスが現在またはプログラムを終了せずに、現在の反復後にインタラクティブbashで実行されているループを停止する方法はありますか?takesalongtime

break;つまり、ループがコマンド間に挿入されているかのように動作し、現在のリモートホストでループが完了した後にループを停止するように何かをしたいと思います。sshdonetakesalongtime

答え1

シェルのpidを見つけてsigintを送ってください。これにより ssh は停止しませんが、完了するとシェルがシグナルを処理し、ループを終了します。

$ for i in {1..100}; do ssh -n localhost 'sleep 9;date'; done

他の端末では

$ ps fax
10636 ?        S      0:00          |   \_ xterm
10638 pts/2    Ss     0:00          |       \_ bash
12164 pts/2    S+     0:00          |           \_ ssh -n localhost sleep 9;date
$ kill -int 10638

&endに追加してコマンドをバックグラウンドとして使用すると、バックグラウンドkill -hupシェルで機能します。

関連情報