SSHコマンドのタイムアウトを設定し、リモートコマンドの結果を取得する方法

SSHコマンドのタイムアウトを設定し、リモートコマンドの結果を取得する方法

何千ものノードに接続し、実行されたコマンドに対して約5つの値を返すRHELサーバーのbashで実行されるスクリプトがあります。これはRHELサーバーからのみ情報を収集します。

うまくいきますが、問題は、次のコマンドを実行すると一部のノードがフリーズすることです。

rpm -q <package-name>
rpm --queryformat '%{installtime:date} %{name}\n' -q <package-name>

これで私のスクリプトが確実に停止するので、sshコマンドのタイムアウトを設定し、いくつかのリモートコマンドが実行されるまで長すぎる(例えば10秒)待つとsshセッションを終了したいと思います。このような場合はタイムアウトし、SSHセッションを終了して次のノードに移動したいと思います。どうすればいいですか?

これは、現在の情報を抽出してdumpという変数に保存するスクリプトの一部です。 [私の貧しいスクリプトは無視してください。私はここで初めてです。]

dump=$(ssh -o ServerAliveCountMax=1 -o ServerAliveInterval=10 -o ConnectTimeout=10 -o BatchMode=yes $i "cat /proc/meminfo | grep -i \"memtotal\" | cut -d \":\" -f2 | tr -d \" \" | tr -d \"kB\"; cat /etc/redhat-release | cut -d \" \" -f7; dmidecode | grep -i \"prod\" | grep -vi \"desktop\"  | grep -iv \"id\" | cut -d \" \" -f3,4| tr \" \" \"_\" ; uptime | cut -d \" \" -f4,5 | tr \" \" \"_\" | tr -d \",\"; service kdump status 2>/dev/null | tr \" \" \"_\";");

持続時間が長すぎるとタイムアウトする方法はありますか?

私が試したこと:

(ssh -q -o Batchmode=yes -o PasswordAuthentication=no -o ConnectTimeout=1 $i "rpm --queryformat '%{installtime:date} %{name}\n' -q \"kexec-tools\" | cut -d \" \" -f1,2,3,4|tr \" \" \"_\"" > /dev/null) & pid=$!
(sleep 10 && kill -HUP $pid ) 2>/dev/null & watcher=$!
if wait $pid 2>/dev/null; then
    pkill -HUP -P $watcher
    wait $watcher
else
    echo -e "$i Unable to ssh" >> res && continue
fi

ただし、この方法ではリモートrpmコマンドの結果を保存することはできません。

どんな助けでも大変感謝します。

ベストアンサー1

コレクションを並列化するには、GNU Parallelを使用してください。

parallel --slf rhel-nodes --tag --timeout 1000% --onall --retries 3 \
  "rpm -q {}; rpm --queryformat '%{installtime:date} %{name}\n' -q {}" \
  ::: bash bc perl

ノードをに入れます~/.parallel/rhel-nodes

--tagノード名が出力の前に追加されます。--timeout 1000%コマンドの実行時間が中央値より10倍長くなると、そのコマンドが終了することを示します。--onallすべてのコマンドはすべてのサーバーで実行されます。--retries 3失敗すると、コマンドは最大3回実行されます。::: bash bc perlテストするパッケージです。パッケージが多いcat packages | parallel ...場合parallel ... ::: packages

GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。

4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

簡単なスケジューリング

代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。

GNU並列スケジューリング

インストールする

ディストリビューションにGNU Parallelがパッケージされていない場合は、rootアクセスなしでプライベートインストールを実行できます。これは10秒で完了できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README

詳細

より多くの例を見る:http://www.gnu.org/software/parallel/man.html

紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel

おすすめ記事