Sambungan drop koneksi internet

9

Perangkat lunak apa yang ada yang akan memainkan peringatan (speaker PC) ketika tidak ada konektivitas internet selama 5 menit?

Switch / router saya sepertinya terputus setiap beberapa hari, dan saya ingin mengatur ulang ketika itu terjadi.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
sumber
3
Bukan untuk menunjukkan yang sudah jelas, tetapi Anda mengambil solusi yang sangat memutar untuk masalah sakelar / router yang rusak
Michael Mrozek

Jawaban:

7

Anda dapat menggunakan versi modifikasi dari skrip ini untuk melakukan apa yang Anda inginkan:

#!/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

Kami "TERHUBUNG" Contoh

Dengan debugging dihidupkan sehingga Anda dapat melihat apa yang dilakukan skrip.

set -x

Berjalan dengan nama host yang valid untuk menunjukkan status "koneksi habis".

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'

Di atas menginisialisasi beberapa variabel dan menentukan kapan terakhir kali kami melewati loop $lastAccessTime,. Kami sekarang mencoba untuk melakukan ping ke Google.

+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955

Kami sekarang menghitung waktu $downTimehenti,, jika ping gagal, jika tidak, kami setel ulang $downTimeke nol, dan hitung ulang $lastAccessTime.

+ sleep 15

Sekarang kita tunggu 15 detik.

+ '[' 0 -ge 300 ']'

Sekarang kami memeriksa apakah kami sudah turun> 5 menit (300 detik). Kemudian kami ulangi melalui whileloop.

+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....

Selama kita bangun, tidak ada yang akan terjadi selain kita memeriksa dengan pingperintah setiap 15 detik.

Kami adalah "TERCONEKTIF" Contoh

Sekarang untuk mensimulasikan keadaan "koneksi terputus", kami akan menukar nama host yang kami ping dan gunakan yang palsu google1234567890.com,. Mengulangi skrip kami dengan debugging yang diaktifkan sekarang kami melihat waktu henti aktual dihitung.

$ ./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
...

Perhatikan di atas yang $downTimesama dengan 15 detik sejauh ini. Jika kita menunggu lebih lama, kita akan melihat ini:

+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15

Kami mengumpulkan 300 detik waktu henti. Jadi sekarang ketika kami memeriksa, kami mencetak pesan alert,.

+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15

Keadaan ini akan berlanjut sampai koneksi dipulihkan dan pingsekali lagi berhasil.

Jadi bagaimana dengan suara?

Itu mudah. Anda dapat menggunakan berbagai alat untuk melakukan ini. Saya akan menggunakan sesuatu seperti soxatau mplayeruntuk memutar file audio seperti .mp3atau .wavfile dengan suara yang sesuai yang ingin Anda dengar setiap 15 detik, saat koneksi sedang tidak aktif.

mplayer someaudio.wav

Cukup ganti alertpesan di atas dengan baris ini untuk mendapatkan umpan balik audio bahwa koneksi sedang down.

Mengatur waktu masalah dengan ping

Jika Anda menggunakan pingcara di atas, Anda mungkin akan menemukan jeda waktu yang lambat di mana dibutuhkan ping10-20 detik untuk gagal ketika koneksi sedang tidak aktif. Lihat jawaban saya untuk T&J T&J ini berjudul: Bagaimana cara mengarahkan output dari perintah apa pun? sebagai contoh menggunakan alat baris perintah fingsebagai gantinya. Alat ini akan gagal lebih cepat daripada yang tradisional ping.

slm
sumber
Btw saya menggunakan beepperintah, apakah aman chown /dev/tty0sehingga saya bisa menggunakannya tanpa sudo?
Kokizzu
1
@ Yokizzu - tidak, Anda tidak boleh mengubah kepemilikan /dev/tty0.
slm
1
Hore, sox! @Kokizzu - hak slm tentang meninggalkan izin pada /dev/tty0perangkat sendirian, tetapi Anda bisa mendapatkan perangkat pseudo-terminal /dev/pts/[num] - jenis perangkat karakter yang sama yang xtermdigunakan untuk setiap jendela, misalnya - dengan sesuatu seperti screenatau tmuxatau bahkan ssh. Ini Anda dapat lebih aman mengontrol karena mereka hanya perangkat budak ke /dev/ptmxperangkat master dan tidak akan menyebabkan masalah yang sama seperti, katakanlah, /bin/loginproses yang dimiliki pengguna mungkin - yang bisa terjadi dalam kasus lain.
mikeserv
aplay alert.wavadalah cara yang lebih standar untuk memainkan suara karena merupakan bagian dari sistem ALSA dan dilengkapi prebundled di sebagian besar distro.
Ray Foss
4

jika Anda menggunakan Linux, Anda dapat menggunakan ping dalam skrip google.commisalnya:

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
Nidal
sumber
3
Ini akan bekerja, tetapi Anda mungkin ingin mempertimbangkan untuk menggunakan fingbukan ping. The pingcmd. dapat mengambil sedikit gagal ketika itu tidak berhasil. The fingperintah pada otherhand akan gagal dalam waktu 1 detik. Lihat A saya untuk Tanya Jawab ini untuk lebih lanjut: Bagaimana cara mengarahkan output dari perintah apa pun? . Saya menunjukkan keduanya menggunakan pingdan fing.
slm
@slm, Terima kasih atas pengeditan Anda, saya bingung bagaimana menjadikan ping hanya berlangsung selama satu detik
Nidal
Tampaknya ini akan mengeksekusi ping dalam jumlah tak terbatas kali per detik jika merespons segera, seperti ketika ethernet kehilangan daya. sleep 1sudah cukup untuk mencegah hal ini.
Ray Foss