Answers:
您可以使用此脚本的修改版本来执行所需的操作:
#!/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秒使用sox
或mplayer
播放一个音频文件(例如.mp3
或).wav
,并且您希望每15秒听到一次具有适当声音的文件。
mplayer someaudio.wav
只需将alert
上面的消息替换为此行,即可获得有关连接已断开的音频反馈。
如果ping
以上述方式使用,您可能会遇到缓慢的延迟时间,ping
在连接断开时,它实际上需要10-20秒才能失败。请参阅标题为“ 如何重定向任何命令的输出”的有关 U&L问答的答案。有关使用命令行工具的示例fing
。此工具将比传统工具更快地失败ping
。
beep
命令,是否安全,chown /dev/tty0
所以我可以不使用它sudo
?
/dev/tty0
。
sox
!@Kokizzu - SLM的要离开的权限右侧/dev/tty0
单独的设备,但你可以得到一个伪终端 /dev/pts/[num]
设备-同一种字符设备是xterm
为每个窗口,例如使用-喜欢的东西screen
或者tmux
甚至是ssh
。您可以更安全地控制这些设备,因为它们毕竟只是主/dev/ptmx
设备的从设备,不会像用户拥有的/bin/login
进程那样引起类似的问题-在其他情况下可能会发生这种情况。
aplay alert.wav
作为ALSA系统的一部分,它是一种更标准的播放声音的方式,并且在大多数发行版中都是预先捆绑的。
如果您使用的是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
fing
而不是ping
。在ping
CMD。如果不成功,可能会有些失败。fing
另一方面,该命令将在1秒内失败。有关更多信息,请参阅我的A:如何重定向任何命令的输出?。我同时展示了ping
和fing
。
sleep 1
足以防止这种情况。