• ベストアンサー

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

utf7の回答

  • utf7
  • ベストアンサー率29% (11/37)
回答No.1

下記のようにすればいいと思います。 ---------- #!/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秒応答がなかったら強制終了ということも可能になると思います。 なお、上記のリトライ回数・インターバルの数値は適当です。

関連するQ&A

  • 【ど素人】シェルスクリプトで、引数の形式チェック【ヘルプミー】

    bashで書いたシェルスクリプトで、 引数を正規表現を用いて入力形式チェックしたいと思っています。 いい方法が思いつかず、とりあえず動作はする以下のスクリプトを 組みました。 echo $1 | grep "正規表現" > /dev/null if [ $? -eq 0 ]; then # あってるときの処理 else # ちがうときの処理 fi どうも、他に良い方法がある気がしてなりませんが、 どうでしょうか? 良い方法があれば教えてください。 また、(ないとは思うけど)この方法が一般的ということであれば、 その旨教えていただけるとありがたいです。 よろしくお願いします。

  • シェルスクリプトエラーになります。

    はじめまして、初心者なので失礼な書き方でしたらご容赦願います。 下記のようなシェルスクリプトを書きました。 実行したところエラーになります。 何がいけなく、正しくはどう記述すればよろしいでしょうか? 何卒ご教授願します。 ===========================ここから=============================== #!/bin/sh test1=12345 test2=678 if ${test1} -eq ${test2} then echo "eq:数値1と数値2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if ${test1} -ne ${test2} then echo "en:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ===========================ここまで============================== ======================実行結果エラーここから======================== $ ./testsh110204.sh ./testsh110204.sh: line 6: 12345: command not found ./testsh110204.sh: line 12: 12345: command not found ********* テスト完了 ********* ======================実行結果エラーここまで======================

  • シェルスクリプト内の「exit」

    クライアントからteratermでservAに接続します。 そこからservBに接続します。 $ ssh servB サーバーBに個人のディレクトリがあり、そこにシェルスクリプトを作っています。 そのシェルスクリプトは「exit 0」で終わっています。 これを実行すると、サーバーBからログアウトしてしまいます。 exitはシェルスクリプト内で使うと、シェルスクリプトを終了するだけかと思ったのですが、ログアウトもしてしまうものなのでしょうか? exitを書かなければ、ログアウトすることなく、カレントディレクトリは変わらないままです。 実行するたびに $ ssh servB $ cd work/mydir と実行しないと自分のディレクトリに戻ってこれないので不便です。 色々と調べたのですが、なぜログアウトしてしまうのかわかりません。 どうすれば、ログアウトしないのか教えて下さい。 よろしくお願いいたします。 シェルスクリプト(TEST) #!/bin/bash -xv echo hello! exit 0 実行結果 [company@servB mydir]$ . TEST hello! Connection to servB closed. [company@servA ~]$

  • シェルスクリプト 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

  • Cシェルスクリプトで二重引用符をechoする

    Cシェルスクリプトで二重引用符をecho するにはどうしたらよいのでしょうか(できるのでしょうか)? エスケープ 「 \" 」のようなエスケープではダメでした。 変数展開をしたいので、一重引用符「'」で括るのではない方法が好都合です。 「VAR is "okwave"」 という出力を得るための同等のスクリプト例(冗長?): #! /bin/csh -f set VAR = "okwave" echo -n "VAR is " echo -n '"' echo -n "$VAR" echo '"' 宜しくお願い致します。

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • シェルスクリプトの変数の制限?

    こんにちは。 シェルスクリプトで謎の現象が起こりまして悩んでいます。 現在、 #!/usr/bin/sh var='foo' if [ $? - eq - 0 ]; then mv xxx.bz2 xxx.old.bz2 echo $var | bzip2 -z >xxx.bz2 fi といった感じのシェルスクリプトを動かしています。 これを手作業で、 foo | bzip2 -z >xxx.tmp.bz2 とやると、xxx.tmp.bz2は1.2MB程度のファイルとなるのですが、 上記のシェルスクリプトで実行すると8KBほどにしかなりません。 シェルスクリプトの変数のサイズの制限かと思い、調べてみましたが、 特に制限があるとの資料はみつかりませんでした。 fooの出力がバイナリなので、そのせいかとも思ったのですが、unix系列の場合、windowsと違ってテキスト/バイナリの区別はないはずだしということで、理由がわかりません。 シェルの変数には、やはり制限があるのでしょうか?それとも他の理由でしょうか。ご存知の方がいらっしゃいましたら、ご教示お願いします。 環境はsolarisです。バージョンは、 $ cat /etc/release Solaris 10 8/07 s10s_u4wos_12b SPARC Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. Use is subject to license terms. Assembled 16 August 2007 です。よろしくお願いします。

  • Linuxシェルでの大量データ投入スクリプト

    Linuxシェルでの大量データ投入スクリプト パフォーマンステスト用の大量(数千万件単位)のデータを DBに投入したいと思っています。 これをLinuxシェルで作成しようと思っています。 今まではsqlplus(あ、DBはoracleです)でログインしてから 複数のSQL文をベタベタ列挙したテキストファイルを読み込んで実行したり シェルの中で1回ずつコネクションを作成して処理を行なう というどちらかの方法しか行なったことがありませんでした。 あと、PLSQLで行なう方法もやったことはありますが、今回は 勉強の意味で、Linuxシェルのみを使用して行ないたいと思っています。 今回は、以下の条件・方針で行ないたいと思っています。とりあえず。 ・すべてのSQL文を記述するのではなく、レコードごとに変化する  IDの部分だけをシェルで埋め込む方法にしたい ・コネクションは何度も接続しなおすのではなく、まとめて1回で行ないたい ・ある程度の件数ごと(実質的には500件くらい)にコミットを行ないたい ・とりあえずLinuxシェルでやってみたい ・とりあえずストアドなしでやりたい 途中まで以下のソースを作成しました。 あとはechoの部分を書き換える感じなのですが、 コネクション管理の方法がわからずつまづいています。 まずは、Linuxシェル内でのコネクション管理をすることが出来るのかどうかを 教えてください。もしできるのであればその方法等を教えてください。 出来れば具体的な記述を下記シェルに埋め込む形での解説をお願いしたいです。 よろしくお願いします。 #!/bin/sh declare -i I=10 echo 【DBコネクション取得】 until [ ${I} -eq 0 ] do echo 【ID部分を埋め込んでINSERT文作成】 echo 【INSERT文実行】 if [ `expr ${I} % 3` -eq 0 ]; then echo 【commit文】 fi I=${I}-1 done echo 【commit文】 echo 【DBコネクション切断】

  • シェルスクリプトとコマンドライン

    iptablesログからSRC=10.10.10.10の通信ログを取得しようとしました。 見よう見まねで下記コマンドラインを作成しました。 【コマンドワンライナー】 for ((i=1;i<9;i++));do da="2013012"$i;logfile=iptables.log-$da.gz ; echo -n $ logfile':';zcat $logfile | grep SRC=10.10.10.10 |wc -l;done 2>/dev/null このとき、所々に「;」を入力しました。 なぜ、;(セミコロン)をそこで入れる必要があったのかが分からないのです。 多分シェルスクリプトで記述した時の 「改行の位置?」ではないかと思っているのですが この認識で間違っていないでしょうか? 【シェル記述 改行の位置で;(セミコロン?)】 #!/bin/sh for ((i=1;i<9;i++))  do da="2013012"$i  logfile=iptables.log-$da.gz  echo -n $logfile':';zcat $logfile | grep SRC=10.10.10.10 |wc -l done 2>/dev/null ご教授お願いします。

  • シェルスクリプトで実行したらエラーが出てきてしまいます。

    今シェルスクリプトでネットにつないだらサーバへ転送するプログラムを作ってます。 下記のような感じでプログラムを作ってcygwinで試しに動かしてみたらなぜかエラーが出ます。 #!/bin/sh #ネットワークにつながっているか確認 if [ping www.yahoo.co.jp 64 2]; then echo "OK" exit 1 #つながっていないのでつながるまで確認 else sleep 10[s] until [ping www.yahoo.co.jp 64 2]; do sleep 10[s] done #バックアップ開始 rsync バックアップ元 バックアップ先 exit 1 fi pingでネットにつないでるか確認しつながっていたらそのまま終了し、 つないでなかったらつながるまで待ち つながったらバックアップするという簡単なプログラムです。 (初心者なもので本で見ながら作りました。単純なプログラムしか作れないので・・・) エラーは行17が文法エラーというのが返ってきます。 ちなみにfiの行です。 どこがだめなんですかね?? 自分的にはいい感じなんですが。笑 また下記のようなプログラムも書いてみましたがfiの行がエラーって出てきます。 #!/usr/bin/sh if ping www.yahoo.co.jp 64 2; then echo "OK" exit else echo "NG" exit fi 詳しい方がいましたらご教授をお願いします。 また上記と似たようなプログラムがある方はぜひ教えてもらえるとうれしいです。 勉強になりますので。 よろしくお願いします。 PC環境 Windows XP Home Edition cygwinを利用している