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

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

ssh を使用して複数のリモート ホストで任意のコマンドを実行したいと考えています。これらのコマンドのほとんどは、サーバーのリソースを監視し、出力をローカル ワークステーションに集約する長時間実行されるコマンドです ( tail -fmpstatまたはtcpdump/tcpflowなどgrep)。

問題は、コマンドを実行したまま、後ですべてのホストの SSH 接続とリモート コマンドの両方を確実に終了する方法が見つからないことです。

私はsshwait、cat、read、traps など、さまざまなフラグのバリエーションを試しました。両方とも即座に終了するか、ローカル ターミナルが停止するか、または 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 ??
}

答え1

何かのようですGNU パラレル次のようなことを試してください:

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

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

-uここでも動作するはずです。通常、行の一部が混ざってしまう可能性がありますが、使用しているコマンドは行ベースである可能性が高いため、そのようなことは発生しないはずです。

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

関連情報