シェルスクリプトでループを止める方法

このQ&Aのポイント
  • サーバAとサーバBの間でPINGの監視を行い、ネットワークが再起動し続ける問題について質問します。
  • シェルスクリプトでサーバAにPINGの返答がない場合、サーバBがプライマリサーバのIPアドレスを引き継ぎますが、その後192.168.1.203にPINGを行い続ける処理が永遠に続いてしまいます。
  • ネットワークが再起動し続ける問題を解決するためには、192.168.1.203にPINGの返答がなくなった場合にループを抜ける処理を追加する必要があります。
回答を見る
  • ベストアンサー

シェルスクリプト while のループを止めるには

サーバA 192.168.1.201(プライマリ) 192.168.1.203(セカンダリ) サーバB 192.168.1.202 サーバBより、サーバA(192.168.1.201)へ定期的にPINGの監視をシェルスクリプトで行います。 192.168.1.201より、PINGの返答がない場合は、サーバBがサーバAのプライマリサーバのIPアドレスを 引き継ぎます。(ここまではシェルでうまくできました。) サーバBはそのまま次にサーバAのセカンダリ(192.168.1.203)に対してPINGを行います。(これは永遠と192.168.1.203より返答がなくなるまで行います。) そして、192.168.1.203より返答がなくなった場合、サーバBは自身の元のIPアドレスへと戻します。 上記内容を下記のようにシェルスクリプトで作成したのですが、下記のようにすると永遠とネットワークが再起動を繰り返し続けてしまい、困っております。 これを止めるには一体何を足せば良いのでしょうか…。 #!/bin/sh TARGET_IP='192.168.1.201'; for ip in $TARGET_IP; do ping $ip -c 4 if [ $? -ne 0 ]; then echo "PING ERROR" ifconfig eth0 192.168.1.201 arp -d 192.168.1.201 #ping にて 100% loss があった場合は、コマンド実行です。 #返答があった場合は、そのまま ping させ続けます。 while [ -n "$(ping -c 1 192.168.1.203 | grep 100%)" ] do echo "Primary server comes back" /etc/init.d/networking restart done fi; done

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

何をしたいのか今ひとつわかりませんが(条件が逆では?)、 >#ping にて 100% loss があった場合は、コマンド実行です。 >#返答があった場合は、そのまま ping させ続けます。 ということであれば、 while [ -n "$(ping -c 1 192.168.1.203 | grep 100%)" ] do : done echo "Primary server comes back" /etc/init.d/networking restart

mintroyale
質問者

お礼

回答ありがとうございます。 ご指摘頂いた通り、 do done の後に実行するコマンドを追加することにより、うまく行きました。 後、grep する文字列が間違っていました。 while [ -n "$(ping -c 1 192.168.1.203 | grep "1 received")" ] でした…。

関連するQ&A

  • シェルスクリプトでwhileを用いてrshを繰り返し使う場合

    Bシェルスクリプトでリモートシェル(rsh)を使う場合の質問です。 現在、以下のような状態です。 有識者の方、アドバイスをお願いします。 ・Aでは、ループされずhostAの場合のみ処理がされます。 (while文が効いていない) ・Bでは、ループされて問題なくhostA,hostB,hostCが処理されます。 (while文が効いている) なぜなのでしょうか。。。(r系コマンドの特性?) ちなみり、リモート側のサーバには.rhostsが設定してあり 問題なくコマンドが通ることは確認済みです。 スクリプトA---------------------------------------------- #!/bin/sh while read line ; do rsh $line hostname done <<END hostA hostB hostC END スクリプトA---------------------------------------------- スクリプトB---------------------------------------------- #!/bin/sh while read line ; do echo " HOST=$line" done <<END hostA hostB hostC END スクリプトB----------------------------------------------

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • While 二重ループ処理について

    Bashのシェルスクリプトでwhileを使いループの処理を行いたい。 現状以下のようにファイルAの中に値”1”とイコールの場合に$awkを表示しています。 これを値”1”部分へファイルBの中の値を順にチェックできるようにしたいのです。 while IFS="$LF" read $READ_R record; do IFS='; ' set -- $record for awk in $3; do if [ "$awk" == "1" ]; then for awk in $4; do echo "$awk" done fi done done < "$1" 初心者のため分かり難い質問かもしれませんがよろしくお願いします。

  • shのシェルスクリプトの演算方法について・・・

    bashのシェルスクリプトについてもお聞きしたのですが、 その方法では演算ができない!ということになってしまいました・・・ こういうちょこっとしたところが違うのが嫌です・・・↓ bashの場合は ---------- bash$ a=1 bash$ a=$(( $a + 1 )) bash$ echo $a 2 ---------- となったのですが、shではエラーが出てしまいました・・・ また、shのスクリプトもbashのスクリプトもシェルスクリプトと呼ぶのでしょうか?

  • シェルスクリプトの質問です

    シェルスクリプトの質問です 質問が連続してしまい、もうしわけございません。 1番目から13番目までの引数を表示させようと思い for i in `1 13` do eval echo '$'$i done をかいたのですが、10番目からは不正確になってしまいます。どうしてでしょうか? どなたかご教授お願いいたします。

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • シェルスクリプトbashについての質問

    #!/bin/bash # トップ画面 function TOPVIEW() { echo "1)クイズ開始" echo "2)このアプリを終了" echo "3)アプリについて" echo "4)クイズ正解率" while echo -n "1,2,3,4を選択してください:" read ANS do case $ANS in 1) echo "正解" break;; 2) echo "終了します";; 3) echo "クイズアプリです";; 4) echo "正解率は";; *) echo "答えは1,2,3,4で入力";; esac done } # 問題作成 function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } 最初の選択でクイズ開始を選択すると問題文に移行、、 終了を選択すると終了できるようにしたいのですが、 設定がわかりません どなたか教えてください お願いします

  • シェルスクリプトについて

    理工系の学生です。 似たような実験プログラムを大量に投げたいので シェルスクリプトを使おうと思っています。 マシンはMac Proです。 今は簡単のため zikken という実験プログラムがあったとして、 これは引数をひとつ取ることにいたします。 たとえば ./zikken 2 などとして2を引数にして動きます。 して例えば引数を変えながら1000回の実験をしたいと思い、 a=0 while [ $a -ne 1000 ] do ./zikken $a done などとしようかと思っているのですがここで質問があります。 zikkenプログラムは一回一回が1時間ほどかかるプログラムです。 (計算機実験なので大量の計算をさせます) 上記のシェルスクリプトで投げた場合、 ./zikken 0 ./zikken 1 ..... とジョブが投げられるはずですが、この場合./zikken 1は ./zikken 0が終了してから投げられるのでしょうか? それとも終了を待たず勝手にボンボンジョブがたまっていくのでしょうか? もし後者の場合だとCPUが完全に占拠されてしまいそうなので不安です。 よろしくお願いいたします。

  • サーバー監視プログラム(シェルスクリプト)

    現在シェルスクリプトでpingによるサーバー監視をプログラムを作成しております。 そこで問題なのですが、応答がないマシンにpingを打つと永遠に終了しません。 スクリプト事態にTTLなど生存時間を設定するのか可能か? 一定時間のあと次の処理に進みたい場合はどうしたらよいか? 5秒応答がなかったら強制終了は可能か? 以下スクリプトです。 --------------------------------------------- #!/bin/sh host=192.168.1.2 ping -c 5 ${host} 1>/dev/null 2>&1 rc=$? if [ ${rc} -eq 0 ]; then echo "${host} is alive." else echo "${host} is not responding or network error." fi exit 0 --------------------------------------------- お願いします。