互联网连接掉线警报


9

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

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

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

3
不必

Answers:


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

我们是“连接”的例子

启用调试后,您可以查看脚本的功能。

set -x

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

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

上面的代码初始化了几个变量,并确定了我们上一次执行循环的时间$lastAccessTime。现在,我们尝试对Google进行ping操作。

+ 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秒检查一次命令外,什么都不会发生。

我们是“断开连接”的例子

现在,要模拟“连接断开”状态,我们将换出要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
...

请注意,$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再次成功为止。

那么声音呢?

这很容易。您可以使用多种工具来执行此操作。在断开连接的情况下,我希望每15秒使用soxmplayer播放一个音频文件(例如.mp3或).wav,并且您希望每15秒听到一次具有适当声音的文件。

mplayer someaudio.wav

只需将alert上面的消息替换为此行,即可获得有关连接已断开的音频反馈。

ping问题超时

如果ping以上述方式使用,您可能会遇到缓慢的延迟时间,ping在连接断开时,它实际上需要10-20秒才能失败。请参阅标题为“ 如何重定向任何命令的输出”的有关 U&L问答的答案有关使用命令行工具的示例fing。此工具将比传统工具更快地失败ping


顺便说一句,我正在使用beep命令,是否安全,chown /dev/tty0所以我可以不使用它sudo
Kokizzu 2014年

1
@Kokizzu-不,您不应该更改的所有权/dev/tty0
slm

1
万岁sox!@Kokizzu - SLM的要离开的权限右侧/dev/tty0单独的设备,但你可以得到一个伪终端 /dev/pts/[num]设备-同一种字符设备是xterm为每个窗口,例如使用-喜欢的东西screen或者tmux甚至是ssh。您可以更安全地控制这些设备,因为它们毕竟只是主/dev/ptmx设备的从设备,不会像用户拥有的/bin/login进程那样引起类似的问题-在其他情况下可能会发生这种情况。
mikeserv 2014年

aplay alert.wav作为ALSA系统的一部分,它是一种更标准的播放声音的方式,并且在大多数发行版中都是预先捆绑的。
雷·福斯

4

如果您使用的是Linux,则可以在脚本中使用ping来执行google.com以下操作:

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
这将起作用,但是您可能需要考虑使用fing而不是ping。在pingCMD。如果不成功,可能会有些失败。fing另一方面,该命令将在1秒内失败。有关更多信息,请参阅我的A:如何重定向任何命令的输出?。我同时展示了pingfing
slm

@slm,感谢您的编辑,我很困惑如何使ping仅持续一秒钟
Nidal

如果立即响应(例如当以太网断电时),这似乎每秒将执行ping无限次。sleep 1足以防止这种情况。
雷·福斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.