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.