Bashスクリプト - 中断されたサーバーを無視する方法

Bashスクリプト - 中断されたサーバーを無視する方法

私はバックグラウンドで1000を超えるサーバーでコマンドを実行するスクリプトを作成しました。時々、スクリプトがサーバーの1つで中断されることがあります。スクリプトの実行中にサーバーが停止した場合(より高い負荷平均のため)、そのサーバーでもコマンドが停止する可能性があります。スクリプトが次のホストに移動して実行を続けるように、そのホストをスキップする方法はありますか?

私のスクリプトの2つの主な機能を強調しましたが、「ConnectTimeout」とスタンバイキーワードは提供していません。

exec_ssh()
{
for i in `cat $file`
do 
    ssh -q -o "StrictHostKeyChecking no" -o "NumberOfPasswordPrompts 0" -o ConnectTimeout=2 $i $command  2>>/dev/null &
        if wait $!; then
                echo "" >> /dev/null
        else
                echo "$i is not reachable over SSH or passwordless authentication is not setup on the server" >> /tmp/not_reachable
        fi

done >/tmp/output.csv &


run_command()
{
                        export -f exec_ssh
                        export command
                        nohup bash -c exec_ssh &>>$log_file &
}

ベストアンサー1

あなたが書いたスクリプト会議すべてのリモートコマンドを同時に実行しますが、waitそれを使用するためにバックグラウンドジョブが完了するまで明示的に待ちます。説明したように、負荷の高いサーバーの場合、これはsshコマンドがタイムアウトせず、単に完了するのに長い時間がかかるため、スクリプトが要求した操作を正確に実行することを意味します。接続がConnectTimeout正常に確立できる場合はssh意味がありません。

分散リモート実行用に設計されたツールの代わりにこれらのスクリプトを実際に使用したい場合は、次のようにします。アンシプール、おそらく、次のようにスクリプトを修正しました。

exec_ssh() {
  while read file; do
    if ! ssh -q -o BatchMode=yes -o ConnectTimeout=2 "$i" "$command"  2>>/dev/null & then
      echo "$i is not reachable via non-interactive SSH or remote command threw error - exit code $?" >> /tmp/not_reachable
    fi
  done < "$file" > /tmp/output.csv &
}

run_command() {
    export -f exec_ssh
    export command
    nohup bash -c exec_ssh &>> "$log_file" &
}

「ホストにSSHで接続できますか?」テストを「作業を完了できますか?」テストから分離することも検討する価値があります。

if ssh -q -o BatchMode=yes -o ConnectTimeout=2 "$host" true; then
    # connection succeeded
  if ! ssh -q -o BatchMode=yes -o ConnectTimeout=2 "$host" "$command" & then
    echo "Remote command threw $?"
  fi
else
    echo "SSH threw $?"
fi

おすすめ記事