所以我想密切关注我的网络连接,以便可以向我的 ISP 提交报告。(似乎调制解调器每天大约会断线一次,持续约 30-60 秒)
所以我复制了这个方便的小脚本
并运行它
watch -n 15 ./ping-test.sh
我一直通过拔掉调制解调器的插头来测试它。
网络断线后,watch 第一次运行脚本时运行正常(发送一些电子邮件),然后就停止运行了。一旦网络恢复,脚本就会“完成”,然后 watch 会再次运行它。
因此,当网络出现故障时,我会收到邮件,但不知道故障持续了多长时间。
如果我直接从命令行运行脚本,它会运行(电子邮件)然后退出。
知道为什么吗?网络断线后,如何让脚本继续运行?
答案1
平如果无法达到目标就会挂起,这也许是脚本失效的原因,因为平仍在等待回复。尝试添加-w 最后期限或者-W 暂停选择平。
答案2
您可以使用“ip monitor”实时执行此操作。这将输出任何事件,例如删除或添加 ip 地址、链接状态从运行变为断开连接,或者路由以某种方式发生变化。
ip monitor all >> /some/log.log &
您必须以附加模式打开。如果您想让它在终端外运行,您可以用“disown %1”放弃该作业
如果您也需要时间戳,有几种方法。一种简单的方法是使用 inotifywait 检查文件是否获得更新,然后将日期附加到其中。将上述操作和此操作放入 shell 脚本中很容易,也许可以放弃它,这样您就可以获得
ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do
sleep 0.2;
date >>/root/mon.log;
done
享受
答案3
您使用“watch”命令的解决方案并不好。我会尝试使用类似下面的方法解决这个问题:
#!/bin/bash
HOSTS="foo.bar foo2.bar"
COUNT=4
while :
do
for myHost in $HOSTS
do
count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ $count -eq 0 ]; then
# 100% failed
echo "Host : $myHost is down (ping failed) at $(date)"
fi
done
sleep 15 # here is your refresh rate
done
然后将其作为普通脚本运行:./script_name.sh
使用 CTRL+C 终止。
答案4
它会失效,因为它已经完成但依赖于watch
仍然存在的父进程 - 命令。
因此,当网络出现故障时,我会收到邮件,但不知道故障持续了多长时间。
该脚本已经打印了远程系统宕机的日期:
echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID
网络中断后如何让脚本继续运行?
它正在ping
运行,-c 1
因此在发送 1 个 ECHO_REQUEST 数据包后它将停止。
将其放入 cron 中每分钟运行一次:
*/1 * * * * /path/to/your/script