🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Q&A

解決済

2回答

14381閲覧

ping死活監視シェルスクリプトを作りたい。

moimoi.44m

総合スコア5

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

0グッド

1クリップ

投稿2019/10/23 01:11

編集2019/10/24 02:17

###実現したいこと
centos7
pingを使用し、死活監視のためのシェルスクリプトを作成したいです。
条件は以下です。
・4発して3発失敗ならメール送信
・ping -c1で1発ずつ実行した結果を評価してNGなら繰り返すという風に書く

1発pingしてOKならば、OK表示。NGであればNG表示しメール送信というシェルスクリプトは作成できました。
どうも書き方がわからないので、参考サイトや書き方がありましたら教えてください。
よろしくお願いします。

試したこと

bash

1#!/bin/sh 2IP_ADDR_ARRAY="IPアドレス"; 3 4NUM=0 5for IP in ${IP_ADDR_ARRAY[@]} 6 do 7 ping ${IP} -c 1 >> /dev/null 8 if [ $? == 0 ] ; 9 then 10 echo "OK" 11 else 12 echo "NG" | echo "NG" | mail -s "Alert of server down" -S smtp=SMTPサーバ -r 送信元アドレス 送信先アドレス 13 fi 14 NUM=expr ${NUM} + 1 15 done

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

showkit

2019/10/23 01:13

先頭行の行頭に 「#」がついていませんね。それと実行権限はついていますか?
dodox86

2019/10/23 01:19

提示するコードは```でくくってください。(マークダウン)  インデントなどの情報が欠落しますし、何より読みづらくなります。https://teratail.com/help/question-tips
moimoi.44m

2019/10/23 02:13

記載したシェルスクリプトは問題なく実行することはできます。 問題はここから、条件(4発して3発失敗ならメール送信)を書き加えたいのです。
dodox86

2019/10/23 03:06 編集

条件が少しあいまいなようです。ping4発は必ずするのですか?そのうち3回NGならメール送信ということでしょうか。 一般的にはpingが1回OKであればそのまま抜け、最大で4回(または3回)NGなら、NG報告としてメール送信というようなかたちかと思います。(リトライ)ですが、念の為に4回は必ずpingを試す、と言うかたちも分からないではないです。 それと、マークダウン、ありがとうございます。```でくくっていただいたようですが、ちょっと違います。 ```bash #!/bin/sh IP_ADDR_ARRAY="IPアドレス"; ``` などとします。teratailのヘルプをご覧ください。
moimoi.44m

2019/10/23 13:27

ping4発は必ずします。そのうち3回NGならメール送信ということです。
guest

回答2

0

ベストアンサー

IP_ADDR_ARRAYは実際には配列??

pingを4回実行して成功を数えればいいです。

Bash

1#!/bin/bash 2IP_ADDR_ARRAY=(IPアドレス1 IPアドレス2 IPアドレス3) 3 4for IP in ${IP_ADDR_ARRAY[@]} 5do 6 NUM=0 7 for i in 1 2 3 4 8 do 9 if ping ${IP} -c 1 &> /dev/null 10 then let NUM++ 11 fi 12 done 13 if [ $NUM -ge 3 ] 14 then 15 echo "OK" 16 else 17 echo "NG" | mail -s "Alert of server down" ~~~ 18 fi 19done

投稿2019/10/23 13:59

編集2019/10/24 03:54
otn

総合スコア85886

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moimoi.44m

2019/10/24 02:44

IPアドレスはlistファイルで呼び出せたらと考えていますが現段階では2つです。 教えていただいたシェルスクリプト実行してみました。 Unknown command: ")" と出てしまいました。 テキストエディタで確認してみましたが、”)”は見つからず、エラーの意味がわかりません。。。
otn

2019/10/24 03:53

> IP_ADDR_ARRAY=(IPアドレス1, IPアドレス2, IPアドレス3) カンマは余計でした。回答は修正しておきます。 > Unknown command: ")" と出てしまいました。 違う物を実行しているとか?
moimoi.44m

2019/10/31 02:24

スクリプトを実行し、Ping応答あった場合には問題なく”OK”と表示されますが、”NG”だった場合にunknown ~と表示されます。指定したアドレスにalert of server downメールはきちんと届いていますし、違うものを実行しているはずはありません。
otn

2019/10/31 06:46

先頭の IP_ADDR_ARRAY=(IPアドレス1 IPアドレス2 IPアドレス3) 以降では、")" を使っていないので、 > Unknown command: ")" と出てしまいました というエラーになるはずはないです。 エラーメッセージはそれで全文ですか? あるいは、pingかmailが、実はシェルスクリプトで、その中で使っているとか?
moimoi.44m

2019/10/31 07:27

/var/log/secure・messagesにエラーはなく、 Unknown command: ")"のみです。 >あるいは、pingかmailが、実はシェルスクリプトで、その中で使っているとか? どういうことでしょう、、?
otn

2019/10/31 07:41

> /var/log/secure・messagesにエラーはなく ?? スクリプトを実行した端末には? > どういうことでしょう、、? /bin/ping や /bin/mail 以外のpingやmailが起動されている可能性です。 「どういうことでしょう?」ということは、可能性なさそうですね。
moimoi.44m

2019/11/01 05:28

スクリプトは親機で実行しています。親機1台kvm子機2台、の計3台を対象にしています。 親機の/var/log/secure・messagesにエラーなし、sh ping.sh失敗で Unknown command: ")"です。 いま、メール本文は、echo "NG ${IP}" | mail -s ~~にしているのですが、サーバーの名前+ ${IP}にしたい場合どのように追記すればよいでしょうか?
otn

2019/11/01 05:59

シェルのエラーメッセージなら、ファイル名と行番号が出るはずですが、出てないとなると、シェルのエラーメッセージじゃないですね。 何が出しているのかを突き止めることからですね。 > サーバーの名前+ ${IP}にしたい場合どのように追記すればよいでしょうか? IPアドレスに対応するホスト名ですか? IPアドレスから、表を引くのでしょうかね。 もしDNS登録されているなら、digやnslookupの結果を見るとか。
guest

0

はずしていたら、ごめんなさい。
ping のコマンド結果を受け取ろうとするのであれば、相手とルートがつながっていれば、ping 自体のコマンドは、成功しているはずです。
ping コマンド自体がエラーになるのは、オプションのエラーや、IP アドレスの記述ミス の場合になります。

なので、ひとつの方法としては、ping が返ってくるまで待つ時間を指定して、タイマをはって、その時間内に通知がなければエラーとすることができるかと思います。これは、ping のコマンドをそのまま使う場合です。

 もう一つの方法として、ping のソースは手に入りますので、ソースをカスタマイズして、ping の結果がかえってきたら OK そうでなければ NG というアプリケーションを作成して、それを使うというやり方です。

投稿2019/10/23 05:30

showkit

総合スコア1638

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問