シェルスクリプトは、サーバーがインターネットに接続されたときに電子メール通知を受け取ります。

シェルスクリプトは、サーバーがインターネットに接続されたときに電子メール通知を受け取ります。

サーバーがインターネットに接続されているかどうかを確認したいです。次のスクリプトを試しましたが、失敗しました。このスクリプトは 5 分ごとに実行され、インターネットに接続されているかどうかを確認して電子メールを送信します。

 ping -c 3 192.168.0.25 > /dev/null 2>&1
    if [ $? -eq 0 ]
    then
      mailx -s "Server is Up" -t "[email protected]" < /dev/null   
  fi

しかし、問題は、接続が確立されると 5 分ごとにメールが継続的に届くことです。どうすればこれを修正できますか?

答え1

ステータスの通知ではなく、ステータスの変更の通知を受け取りたいからです。そのため、以前のステータスが何であったかをどこかに覚えておく必要があります。たとえば、次のようになります。

#! /bin/bash

statusFile=/var/tmp/connected # used to remember status
pingedHost=8.8.8.8
checkPeriod=5 # seconds

while true
do
    echo "Sleeping..."
    sleep $checkPeriod
    echo "Checking..."
    ping -c 1 $pingedHost > /dev/null 2>&1
    if [[ $? -eq 0 ]]
    then
        echo "Ping OK..."
        if [[ ! -f $statusFile ]] # not connected already
        then
            echo "Reconnected..."
            # send reconnection mail here
            touch $statusFile # remember state
        fi
    else
        echo "Ping KO..."
        if [[ -f $statusFile ]] # was connected before
        then
            echo "Disconnected..."
            # send disconnection mail here
            rm $statusFile # remember state
        fi
    fi
done

答え2

-e ではなく、結果がゼロかどうかをチェックする方が良いのではないでしょうか?

if [$? -eq 0]  

あるいはこれ

if [$? -e 0]  

単なる入力ミスでしょうか?

関連情報