Sshを使用して複数のリモートホストで任意のコマンドを実行したい。これらのコマンドは主に、サーバーリソースを監視し、出力をローカルワークステーションに集約する長時間実行コマンドです(tail -f
、mpstat
、またはtcpdump
/tcpflow
with grep
など)。
問題は、後ですべてのホストのSSH接続とリモートコマンドの両方を確実に終了しながら、コマンドを実行し続ける方法が見つからないことです。
多くのssh
フラグのバリエーション、待機、猫、読み取り、トラップなどを試しました...両方が即座に強制終了されるか、ローカル端末がスタックするか、ssh接続が行われた後もリモートコマンドがリモートホストで実行され続けます殺された。
これは私が現在持っているものです。
function server_ssh() {
pids=""
for box in 01 02 03; do
ssh -t -t -f server$box "$1" &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
# wait, cat, read ??
}
gnu parallel のように見えます。次のようなものを試してください。
function server_ssh() {
parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}
--line-buffer
オプションは、異なるコマンドの出力を混合できるようにするために必要です(デフォルトでは、各コマンドの出力がグループ化されるため、それぞれが表示を終了するまで待機する必要があります)。
-u
はここでも機能するはずです。通常、行の一部が混同される可能性がありますが、使用しているコマンドは行ベースである可能性が高いため、発生しないはずです。
編集:--line-buffer
は私が持っているバージョン(20130922-1)でアルファテスト中です、私は-u
で行きます。