そこで、ISP にレポートを送れるように、ネットワーク接続を監視したいのです。(モデムは 1 日に 1 回程度、30 ~ 60 秒間切断されるようです)
そこで私はこの便利なスクリプトをコピーしました
そしてそれを実行する
watch -n 15 ./ping-test.sh
モデムのプラグを抜いてテストしています。
ネットワークが切断された後、watch が最初にスクリプトを実行すると、スクリプトは正常に実行され (電子メールが送信されます)、その後機能しなくなります。ネットワークが復元されると、スクリプトは「終了」し、watch はスクリプトを再度実行します。
つまり、ネットワークがダウンしたときにはメールが届きますが、ダウンしていた時間はわかりません。
スクリプトをコマンド ラインから直接実行すると、スクリプトは実行され (電子メールが送信され)、その後終了します。
理由が何か分かりますか? ネットワークがダウンした後もスクリプトを実行し続けるにはどうすればよいですか?
答え1
ピンスクリプトがターゲットに到達できない場合はハングアップし、それがスクリプトが機能しなくなる理由かもしれません。ピンまだ返信を待っています。-w 締め切りまたは-W タイムアウトオプションにピン。
答え2
「ip monitor」を使用すると、これをリアルタイムで実行できます。これにより、IP アドレスが削除または追加されたり、リンク状態が動作状態から切断状態に変わったり、ルートが何らかの方法で変更されたりといったイベントが出力されます。
ip monitor all >> /some/log.log &
追加モードで開く必要があります。ターミナル外で実行したい場合は、「disown %1」でジョブを破棄できます。
タイムスタンプも必要な場合は、いくつかの方法があります。簡単な方法は、inotifywaitを使用してファイルが更新されたかどうかを確認し、日付を追加することです。上記の操作とこれをシェルスクリプトで実行し、代わりにそれを破棄すると、次のようになります。
ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do
sleep 0.2;
date >>/root/mon.log;
done
楽しむ
答え3
'watch' コマンドを使用した解決策は適切ではありません。次のような方法で解決してみます:
#!/bin/bash
HOSTS="foo.bar foo2.bar"
COUNT=4
while :
do
for myHost in $HOSTS
do
count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ $count -eq 0 ]; then
# 100% failed
echo "Host : $myHost is down (ping failed) at $(date)"
fi
done
sleep 15 # here is your refresh rate
done
通常のスクリプトとして実行します: ./script_name.sh
CTRL+C で終了します。
答え4
すでに終了しているが、まだ実行中の親プロセス (watch
コマンド) に依存しているため、機能しなくなります。
つまり、ネットワークがダウンしたときにはメールが届きますが、ダウンしていた時間はわかりません。
このスクリプトは、リモート システムがダウンしたときに日付をすでに出力しています。
echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID
ネットワークがダウンした後もスクリプトを実行し続けるにはどうすればよいですか?
1 つの ECHO_REQUEST パケットを送信した後、停止しping
ます。-c 1
1 分ごとに実行されるように cron に追加します。
*/1 * * * * /path/to/your/script