web-dev-qa-db-ja.com

複数のリモートホストでのsshコマンドのクリーンアップトラップ

Sshを使用して複数のリモートホストで任意のコマンドを実行したい。これらのコマンドは主に、サーバーリソースを監視し、出力をローカルワークステーションに集約する長時間実行コマンドです(tail -fmpstat、または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 ??
}
6
deephacks

gnu parallel のように見えます。次のようなものを試してください。

function server_ssh() {
  parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}

--line-bufferオプションは、異なるコマンドの出力を混合できるようにするために必要です(デフォルトでは、各コマンドの出力がグループ化されるため、それぞれが表示を終了するまで待機する必要があります)。

-uはここでも機能するはずです。通常、行の一部が混同される可能性がありますが、使用しているコマンドは行ベースである可能性が高いため、発生しないはずです。

編集:--line-bufferは私が持っているバージョン(20130922-1)でアルファテスト中です、私は-uで行きます。

2
lemonsqueeze