คุณสามารถใช้สคริปต์นี้เพื่อแก้ไขสิ่งที่คุณต้องการ:
#!/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
เราเป็นตัวอย่าง "CONNECTED"
เมื่อเปิดการดีบักแล้วคุณจะเห็นว่าสคริปต์ทำอะไรอยู่
set -x
การรันด้วยชื่อโฮสต์ที่ถูกต้องเพื่อแสดงสถานะ "การเชื่อมต่อ is up"
$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'
ข้างต้นเริ่มต้นตัวแปรสองสามตัวและกำหนดครั้งสุดท้ายที่เราผ่านลูป, $lastAccessTime
. ตอนนี้เราพยายาม ping Google
+ 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 วินาที
เราเป็นตัวอย่าง "ตัดการเชื่อมต่อ"
ตอนนี้เพื่อจำลอง "การเชื่อมต่อเป็นลง" 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
หรือmplayer
เล่นไฟล์เสียงเช่น.mp3
หรือ.wav
ไฟล์ที่มีเสียงที่เหมาะสมที่คุณต้องการฟังทุก ๆ 15 วินาทีในขณะที่การเชื่อมต่อไม่ทำงาน
mplayer someaudio.wav
เพียงแค่แทนที่alert
ข้อความด้านบนด้วยบรรทัดนี้เพื่อรับเสียงตอบรับที่การเชื่อมต่อไม่ทำงาน
หมดเวลาปัญหากับ ping
หากคุณใช้ping
ในลักษณะข้างต้นคุณอาจพบว่ามีความล่าช้าช้าซึ่งใช้เวลาping
10-20 วินาทีในการล้มเหลวเมื่อการเชื่อมต่อหยุดทำงาน ดูคำตอบของฉันสำหรับคำถามและคำตอบเกี่ยวกับ U&L นี้: จะเปลี่ยนทิศทางผลลัพธ์ของคำสั่งใดได้อย่างไร สำหรับตัวอย่างโดยใช้เครื่องมือบรรทัดคำสั่งfing
แทน ping
เครื่องมือนี้จะล้มเหลวได้รวดเร็วยิ่งขึ้นกว่าเดิม