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 $downTime
về 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 while
vò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 ping
lệ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 $downTime
là 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à ping
mộ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ư sox
hoặc mplayer
để phát một tệp âm thanh như một .mp3
hoặc .wav
tệ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ế alert
thô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 ping
theo 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 fing
thay thế. Công cụ này sẽ thất bại nhanh hơn so với truyền thống ping
.