次の形式の17のサーバーのリストがあります。
172.16.6.45 i-052463fs (test-mv1)
172.16.6.46 i-9e2263rf (test-mv2)
SSH /ログインを介して各サーバーにアクセスして終了できるスクリプトが必要です。これは簡単ですが、問題は、前のサーバーが下にある必要がある上記の特定の順序(リストの下)で終了する必要があることです。完全に終了する前に終了が開始されます。
n秒ごとにpingを送信し、k秒以内に応答がない場合は、中断されるコマンドの後にループを追加する方法はありますか?
答え1
次のことができます。
while IFS=' (' read <&3 ip id name rest; do
ssh -n -o ConnectTimeout=3 -o BatchMode=yes -o HostKeyAlias="$name" "$ip" poweroff &&
while ping -qw 10 -c3 "$ip"; do
sleep 1
done
done 3< list.txt
このコードに関するいくつかの注意:
- 私たちは使用名前たぶんHostKeyAliasの一部としてもっと意味があるかもしれません
$id
。理想的には、sshdサーバーのホストキーに何かを追加する必要があります。 - ここでは無人スクリプトを実行するため、
-n
forとBatchModeを使用します。この目的のために専用項目を指定することもssh
できます。UserKnownHostsFile
while
成功しない場合、ssh
ループは実行されません。この場合、エラーが発生してスクリプトを終了することもできます。サーバーをシャットダウンできない状況を考慮して、whileループの繰り返しに上限を追加することもできます。- 私たちのループは1秒間隔で3つのpingプローブを実行し、10秒後に放棄します。
ping
(少なくとも1つのプローブが応答した場合、Debianのプローブはtrueを返します。iputils
これは実際のパケット損失をカバーする必要があります。3つのプローブのうち2つの間の1秒の遅延は、ループなどのサーバーのオーバーフローをwhile ping -c1
防ぎます。送信後に遅延応答を受け取らずに調べると、サーバーはIPスタックを引き裂いた後に終了するのに十分な時間を提供できます。
答え2
ssh host sudo shutdown -h -y now ; ping -c 1 host ; while [ $? = 0 ] ; do ping -c 1 host ; done