Internet 连接中断警报

Kok*_*zzu 11 networking monitoring audio

有什么软件可以在 5 分钟没有任何互联网连接时播放警报(PC 扬声器)?

我的交换机/路由器似乎每隔几天就会断开连接,我想在它发生时重置它。

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 7

您可以使用此脚本的修改版本来执行您想要的操作:

#!/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
Run Code Online (Sandbox Code Playgroud)

我们“已连接”示例

打开调试后,您就可以看到脚本在做什么。

set -x
Run Code Online (Sandbox Code Playgroud)

使用有效的主机名运行以演示“连接已启动”状态。

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'
Run Code Online (Sandbox Code Playgroud)

以上初始化了几个变量并确定了我们最后一次通过循环的时间$lastAccessTime。我们现在尝试ping Google。

+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
Run Code Online (Sandbox Code Playgroud)

我们现在计算任何停机时间,$downTime如果 ping 失败,否则,我们重置$downTime为零,并重新计算$lastAccessTime

+ sleep 15
Run Code Online (Sandbox Code Playgroud)

现在我们等待 15 秒。

+ '[' 0 -ge 300 ']'
Run Code Online (Sandbox Code Playgroud)

现在我们检查是否已经停机 > 5 分钟(300 秒)。然后我们重复遍历while循环。

+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....
Run Code Online (Sandbox Code Playgroud)

只要我们启动,除了ping每 15 秒检查一次命令之外,什么也不会发生。

我们“断开连接”示例

现在为了模拟“连接关闭”状态,我们将换出我们正在 ping 的主机名并使用一个假主机名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
...
Run Code Online (Sandbox Code Playgroud)

请注意,$downTime到目前为止,这等于 15 秒。如果我们再等一会儿,我们会看到:

+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15
Run Code Online (Sandbox Code Playgroud)

我们已经累积了 300 秒的停机时间。所以现在当我们检查时,我们打印消息,alert

+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15
Run Code Online (Sandbox Code Playgroud)

这种状态将一直持续到连接恢复并ping再次成功。

那么声音呢?

这很容易。您可以使用多种工具来执行此操作。当连接断开时,我会使用类似soxor 的东西mplayer来播放音频文件,例如带有您希望每 15 秒听到一次的适当声音的.mp3.wav文件。

mplayer someaudio.wav
Run Code Online (Sandbox Code Playgroud)

只需alert用这一行替换上面的消息,即可获得连接中断的音频反馈。

ping 超时问题

如果您ping以上述方式使用,您可能会遇到缓慢的延迟时间,ping当连接断开时,它实际上需要10-20 秒才能失败。请参阅我对此 U&L 问答的回答,标题为:如何重定向任何命令的输出?例如,使用命令行工具fing代替。这个工具会比传统的更快失败ping