Help us understand the problem. What is going on with this article?

適当にサクっとping確認スクリプトを書いてみる

適当にサクっとping確認スクリプトを書いてみる

要件

  • 対象IPは、ip_node.listに記載する。
  • packet lossが少しでもあれば、メール通知する。
  • ネットワークの設定やメールの設定は終えている。

対象IPリスト

以下の感じで記載しておく。

192.168.11.21
192.168.11.29
192.168.11.69
192.168.11.88
192.168.11.99

スクリプト本体

こんな感じ。

bash
#!/bin/bash
LANG=C;
export LANG;
:> ~/mail.dat;
while read line;do
  _RET_=`ping -c 5 -i 1 -w 10 -s 32 ${line} | grep 'loss' | grep -oP '[0-9]+%'`;
  echo "${line} ${_RET_} loss";
  [ "0%" == "${_RET_}" ] && continue;
  echo "${line} ${_RET_} loss" >> ~/mail.dat;
done <~/ip_node.list;
_RET_=`du ~/mail.dat | awk '{print $1}' | xargs expr`;
[ ! 0 -eq ${_RET_} ] && mail -s "IP packet loss alert." -r [from addr] [to addr] < ~/mail.dat;
exit 0;

スクリプト本体(コメント付)

bash
#!/bin/bash
LANG=C;
export LANG;   #日本語でPing結果が表示されるとgrepの正規表現が面倒なのでLANG=Cに固定

:> ~/mail.dat;   #メール通知用の本文を0byteにする

while read line;do   #後述doneの部分で、ファイル入力して$lineに1行ずつ変数入り

  _RET_=`ping -c 5 -i 1 -w 10 -s 32 ${line} | grep 'loss' | grep -oP '[0-9]+%'`;   #Pingを実施、オプション等はお好みで調整し、gpreでマッチした部分を取得

  echo "${line} ${_RET_} loss";

  [ "0%" == "${_RET_}" ] && continue;   # 0%以外は通知なのでこれでよい

  echo "${line} ${_RET_} loss" >> ~/mail.dat;   #通知用に書き込み

done <~/ip_node.list;

_RET_=`du ~/mail.dat | awk '{print $1}' | xargs expr`;   #通知用のファイルのサイズを取得

[ ! 0 -eq ${_RET_} ] && mail -s "IP packet loss alert." -r [from addr] [to addr] < ~/mail.dat;   #0以外であれば、通知

exit 0;
xus
のんびりサラリーマンをやりながら、IT分野で息しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away