回答:
このスクリプトの変更バージョンを使用して、必要な操作を実行できます。
#!/bin/bash
downTime=0
lastAccessTime=$(date +"%s")
while [ true ]; do
if ! ping -c1 google.com >& /dev/null; then
downTime=$(( $(date +"%s") - $lastAccessTime ))
else
downTime=0
lastAccessTime=$(date +"%s")
fi
sleep 15
if [ $downTime -ge 300 ]; then
echo "alert"
fi
done
デバッグをオンにすると、スクリプトの動作を確認できます。
set -x
有効なホスト名で実行して、「接続がアップ」状態を示します。
$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'
上記はいくつかの変数を初期化し、ループを最後に通過した時間を決定します$lastAccessTime
。次に、Googleにpingを送信します。
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
ここで$downTime
、pingが失敗した場合のダウンタイムを計算し、そうでない場合は$downTime
ゼロにリセットして、再計算し$lastAccessTime
ます。
+ sleep 15
15秒待ちます。
+ '[' 0 -ge 300 ']'
次に、5分(300秒)以上ダウンしているかどうかを確認します。次に、while
ループを繰り返します。
+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....
起動している限り、ping
15秒ごとにコマンドで確認する以外は何も起こりません。
「接続がダウンしている」状態をシミュレートするために、pingを実行しているホスト名を交換し、偽のホスト名を使用しますgoogle1234567890.com
。デバッグを有効にしてスクリプトの実行を繰り返すと、実際のダウンタイムが計算されることがわかります。
$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402277506
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=0
+ sleep 15
+ '[' 0 -ge 300 ']'
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=15
+ sleep 15
...
その上の注意事項は$downTime
、これまでに15秒に等しいです。しばらく待つと、次のようになります。
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15
300秒のダウンタイムが発生しました。したがって、チェックすると、メッセージを出力しalert
ます。
+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15
この状態は、接続が復元されてping
再び成功するまで続きます。
簡単だ。これにはさまざまなツールを使用できます。sox
またはのようなものを使用して、接続がダウンしている間、15秒ごとに聞きたい適切なサウンドのやmplayer
ファイルなどのオーディオファイルを再生します。.mp3
.wav
mplayer someaudio.wav
alert
上記のメッセージをこの行に置き換えるだけで、接続がダウンしているという音声フィードバックが得られます。
ping
上記の方法で使用ping
すると、接続がダウンしているときに文字通り10〜20秒で障害が発生するまでの時間がかかる可能性があります。このU&L Q&Aへの私の回答を参照してください:コマンドの出力をリダイレクトする方法?fing
代わりにコマンドラインツールを使用した例を示します。このツールは、従来のツールよりも速く失敗しますping
。
beep
コマンドを使用していますが、安全にchown /dev/tty0
使用できますsudo
か?
/dev/tty0
。
sox
!@Kokizzu -に権限を残す程度SLMの権利/dev/tty0
だけでは、デバイスが、あなたが得ることができる疑似端末 /dev/pts/[num]
デバイスを-キャラクタデバイスの同じ種類のものxterm
例えば各ウィンドウの用途、 -のようなものを持つscreen
かtmux
、あるいはssh
。これらはマスターデバイスのスレーブデバイス/dev/ptmx
であり、ユーザーが所有する/bin/login
プロセスと同じような問題を引き起こさないため、より安全に制御できます。これは、他のケースで発生する可能性があります。
aplay alert.wav
ALSAシステムの一部であり、ほとんどのディストリビューションにあらかじめ組み込まれているため、サウンドを再生するためのより標準的な方法です。
Linuxを使用している場合は、スクリプト内でpingを使用してgoogle.com
、たとえば次のことができます。
counter=0
while [ true ]
do
ping -c 1 google.com > /dev/null 2>&1
if [ $? -ne 0 ]
then
let "counter +=1"
else
let "counter = 0"
fi
if [ $counter -eq 300 ] # we assume that one ping need one second (300 is 5 minutes)
then
echo "alert"
fi
done
fing
代わりに使用することを検討したい場合がありping
ます。ping
CMD。成功しない場合、少し失敗する可能性があります。fing
otherhand上のコマンドは、1秒以内に失敗します。詳細については、このAをこのQ&Aで参照してください:コマンドの出力をリダイレクトする方法?。との両方を使用して表示ping
しfing
ます。
sleep 1
これを防ぐには十分です