複数のリモートサーバーで時間がかかるプログラムを実行することがよくあります。
for NUM in {1..100}; do ssh host-{NUM}.mydomain.com /usr/bin/takesalongtime; done
ほとんどの場合、バックグラウンドで(つまり、他のタスクの実行中にターミナルエミュレータで)実行されるようにして、完了するまで待ちます。しかし、時にはループを中断し、後で続行するか再実行する必要があります。
ssh
プロセスが現在またはプログラムを終了せずに、現在の反復後にインタラクティブbashで実行されているループを停止する方法はありますか?takesalongtime
break;
つまり、ループがコマンド間に挿入されているかのように動作し、現在のリモートホストでループが完了した後にループを停止するように何かをしたいと思います。ssh
done
takesalongtime
答え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
シェルで機能します。