ここでは、複数のサーバーにリモートでSSHを接続し、これらのサーバーでプロセスが実行されていることを確認し、プロセスが完了するのを待ちます。
while read ip name
do
process=alive
while [[ "$process" == "alive" ]]
do
process=dead
(if [ 1 -eq "$(echo "$(ssh ubuntu@$ip "top -b -n2 -d 0.5|grep Cpu|awk '{print \$2+\$4}'|tail -n1") > 1" | bc)" ];then
echo "Process is running on $ip"
process=alive
sleep 10
continue
else
echo "Process is not running on $ip"
echo "I run some other commands here"
fi) &
done
done < ips
wait `jobs -p`
"continue"ステートメントの後にコードが壊れています。
これが出力です
+ read ip name
+ process=alive
+ [[ alive == \a\l\i\v\e ]]
+ process=dead
+ [[ dead == \a\l\i\v\e ]]
+ read ip name
+ process=alive
+ [[ alive == \a\l\i\v\e ]]
+ process=dead
+ [[ dead == \a\l\i\v\e ]]
+ read ip name
++ jobs -p
++ bc
+ wait 31090 31091
+++ ssh [email protected] 'top -b -n2 -d 0.5|grep Cpu|awk '\''{print $2+$4}'\''|tail -n1'
++ bc
+++ ssh [email protected] 'top -b -n2 -d 0.5|grep Cpu|awk '\''{print $2+$4}'\''|tail -n1'
++ echo '20.7 > 1'
+ '[' 1 -eq 1 ']'
+ echo 'Process is running on 249.X.X.X'
Process is running on 249.X.X.X
+ process=alive
+ sleep 10
++ echo '14.6 > 1'
+ '[' 1 -eq 1 ']'
+ echo 'Process is running on 256.X.X.X'
Process is running on 256.X.X.X
+ process=alive
+ sleep 10
+ continue
+ continue
答え1
stdin(ファイルips)読み取り停止ssh
に置き換えられました。ssh -n
望むより:man ssh
答え2
ただし、標準入力へのssh -n
リダイレクトを使用すると、即時の問題が解決されます。それ以外の場合はファイルから読み込まれます。しかし、私はコードで他の不要な作業をしています。/dev/null
ssh
-n
ssh
ips
修正されたコード:
while read ip name; do
(
while true; do
if ssh -n "ubuntu@$ip" top -b -n2 -d 0.5 | awk '/Cpu/ && n++ { exit($2+$4 > 1) }'
printf 'Process is running on %s\n' "$ip"
sleep 10
else
printf 'Process is not running on %s\n' "$ip"
echo 'I run some other commands here'
break
fi
done
) &
done <ips
wait
コードを簡素化しました
top
リモートホストでもう何も実行せずにawk
で終了値を直接使用してくださいif
。break
(現在)無限ループを破るために- 文だけでなくバックグラウンドジョブでループを実行し
if
ます。 wait
すべてのバックグラウンドプロセスを待つには、引数なしで使用してください。
if
このドアがまったく必要ない別のバリエーションは次のとおりです。
while read ip name; do
(
while ssh -n "ubuntu@$ip" top -b -n2 -d 0.5 | awk '/Cpu/ && n++ { exit($2+$4 > 1) }'
do
printf 'Process is running on %s\n' "$ip"
sleep 10
done
printf 'Process is not running on %s\n' "$ip"
echo 'I run some other commands here'
) &
done <ips
wait