Cảnh báo thả kết nối Internet


9

Phần mềm nào ở đó sẽ phát cảnh báo (loa PC) khi không có kết nối internet trong 5 phút?

Công tắc / bộ định tuyến của tôi dường như ngắt kết nối cứ sau vài ngày và tôi muốn đặt lại khi nó xảy ra.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d

3
Không chỉ ra điều hiển nhiên, nhưng bạn đang thực hiện một giải pháp rất vòng vo cho vấn đề về bộ chuyển đổi / bộ định tuyến bị lỗi
Michael Mrozek

Câu trả lời:


7

Bạn có thể sử dụng phiên bản sửa đổi của tập lệnh này để làm những gì bạn muốn:

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

Ví dụ "KẾT NỐI"

Khi gỡ lỗi được bật để bạn có thể thấy kịch bản đang làm gì.

set -x

Chạy với tên máy chủ hợp lệ để thể hiện trạng thái "kết nối đã hết".

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

Ở trên khởi tạo một vài biến và xác định lần cuối cùng chúng ta đi qua vòng lặp , $lastAccessTime. Bây giờ chúng tôi cố gắng ping Google.

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

Bây giờ chúng tôi tính toán bất kỳ thời gian ngừng hoạt động nào $downTime, nếu ping không thành công, nếu không, chúng tôi sẽ đặt lại $downTimevề 0 và tính toán lại $lastAccessTime.

+ sleep 15

Bây giờ chúng tôi chờ 15 giây.

+ '[' 0 -ge 300 ']'

Bây giờ chúng tôi kiểm tra xem chúng tôi đã xuống trong 5 phút chưa (300 giây). Sau đó, chúng tôi lặp lại đi qua whilevòng lặp.

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

Miễn là chúng tôi lên, sẽ không có gì xảy ra ngoài việc chúng tôi kiểm tra bằng pinglệnh cứ sau 15 giây.

Chúng tôi là ví dụ "KHÁM PHÁ"

Bây giờ để mô phỏng trạng thái "kết nối không hoạt động", chúng tôi sẽ trao đổi tên máy chủ chúng tôi đang ping và sử dụng tên giả , google1234567890.com. Lặp lại một lần chạy tập lệnh của chúng tôi với gỡ lỗi được kích hoạt, bây giờ chúng tôi thấy một số thời gian thực tế được tính toán.

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

Lưu ý ở trên $downTimelà bằng 15 giây cho đến nay. Nếu chúng ta đợi lâu hơn chúng ta sẽ thấy điều này:

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

Chúng tôi đã tích lũy được 300 giây thời gian. Vì vậy, bây giờ khi chúng tôi kiểm tra, chúng tôi in thông báo alert,.

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

Trạng thái này sẽ tiếp tục cho đến khi kết nối được khôi phục và pingmột lần nữa thành công.

Vậy một âm thanh thì sao?

Điều đó thật dễ dàng. Bạn có thể sử dụng nhiều công cụ để làm điều này. Tôi sẽ sử dụng một cái gì đó như soxhoặc mplayerđể phát một tệp âm thanh như một .mp3hoặc .wavtệp có âm thanh phù hợp bạn muốn nghe cứ sau 15 giây, trong khi kết nối bị tắt.

mplayer someaudio.wav

Chỉ cần thay thế alertthông báo ở trên bằng dòng này để nhận phản hồi âm thanh rằng kết nối bị hỏng.

Thời gian ra vấn đề với ping

Nếu bạn sử dụng pingtheo cách trên, bạn sẽ gặp phải thời gian trễ chậm trong đó mất pingđúng 10-20 giây để nó bị lỗi khi kết nối bị ngắt. Xem câu trả lời của tôi cho câu hỏi và trả lời U & L này có tiêu đề: Làm thế nào để chuyển hướng đầu ra của bất kỳ lệnh nào? cho một ví dụ sử dụng công cụ dòng lệnh fingthay thế. Công cụ này sẽ thất bại nhanh hơn so với truyền thống ping.


Btw Tôi đang sử dụng beeplệnh, nó có an toàn để chown /dev/tty0tôi có thể sử dụng mà không cần sudo?
Kokizzu

1
@Kokizzu - không, bạn không nên thay đổi quyền sở hữu trên /dev/tty0.
slm

1
Hoan hô , sox! @Kokizzu - ngay SLM về để lại các điều khoản trên /dev/tty0thiết bị riêng, nhưng bạn có thể nhận được một giả thiết bị đầu cuối /dev/pts/[num] thiết bị - cùng một loại thiết bị nhân vật mà xtermsử dụng cho mỗi cửa sổ, ví dụ - với một cái gì đó giống như screenhoặc tmuxhoặc thậm chí ssh. Những điều này bạn có thể kiểm soát một cách an toàn hơn vì dù sao chúng chỉ là thiết bị nô lệ cho /dev/ptmxthiết bị chính và sẽ không gây ra vấn đề tương tự như, như một /bin/loginquy trình do người dùng sở hữu - đó là điều có thể xảy ra trong trường hợp khác.
mikeerv

aplay alert.wavlà một cách tiêu chuẩn hơn để phát âm thanh vì nó là một phần của hệ thống ALSA và được tích hợp sẵn trong hầu hết các bản phát hành.
Ray Foss

4

nếu bạn đang sử dụng Linux, bạn có thể sử dụng ping trong tập lệnh google.comchẳng hạn:

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

3
Điều này sẽ hoạt động, nhưng bạn có thể muốn xem xét sử dụng fingthay vì ping. Các pingcmd. có thể mất một chút để thất bại khi nó không thành công. Các finglệnh trên otherhand sẽ thất bại trong vòng 1 giây. Xem phần A của tôi để hỏi đáp này để biết thêm: Làm thế nào để chuyển hướng đầu ra của bất kỳ lệnh nào? . Tôi hiển thị cả sử dụng pingfing.
slm

@slm, Cảm ơn bạn đã chỉnh sửa, tôi đã bối rối làm thế nào để ping chỉ tồn tại trong một giây
Nidal

Có vẻ như điều này sẽ thực thi ping một số lần không giới hạn mỗi giây nếu nó phản hồi ngay lập tức, chẳng hạn như khi ethernet mất điện. sleep 1là đủ để ngăn chặn điều này.
Ray Foss
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.