- ベストアンサー
サーバー監視プログラム(シェルスクリプト)
現在シェルスクリプトで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 --------------------------------------------- お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
手元(RedHat)のpingには、 『-w waittime どのような場合でも関係なく、ping を waittime 秒後に終了させる。』 というオプションがありますが、お使いの物に無いでしょうか?無い場合、次のようにすれば良いと思います。 -----ping-sub---------------- #!/bin/sh exec >/dev/null 2>/dev/null ping -c 5 $1 & sleep 5 kill $! ----------------------------- というのを作って、これをpingの代わりに使います。 host=192.168.1.2 ping-sub ${host} rc=$? ホストが生きていれば、pingは4秒で終わるのでkill $!は空振りして、rc=1 となり、ホストが死んでいればpingは動きつづけるので、kill $! が成功して rc=0 となります。ping単体の場合とrcが逆になるのに注意。
その他の回答 (1)
- utf7
- ベストアンサー率29% (11/37)
下記のようにすればいいと思います。 ---------- #!/bin/sh host=192.168.1.2 max_retry=3 # リトライ回数 retry_interval=5 # リトライインターバル count=0 # リトライ回数カウンタ while [ : ]; do # 存在する? /usr/sbin/ping $host 2 > /dev/null 2>&1 if [ $? -eq 0 ] then echo "${host} is alive." exit 0 fi count=`expr $count + 1` echo "PING失敗[$count]回目" if [ $count -eq $max_retry ]; then echo "${host} is not responding or network error." exit 2 fi # リトライのインターバル sleep "$retry_interval" done exit 0 ---------- 上記はpingによるサーバ存在チェックのみですが、関数化してexitのところをreturnなどにすれば、一定時間後に次の処理に進んだり5秒応答がなかったら強制終了ということも可能になると思います。 なお、上記のリトライ回数・インターバルの数値は適当です。