使用 watch 运行 shell 脚本 - 但脚本失效

使用 watch 运行 shell 脚本 - 但脚本失效

所以我想密切关注我的网络连接,以便可以向我的 ISP 提交报告。(似乎调制解调器每天大约会断线一次,持续约 30-60 秒)

所以我复制了这个方便的小脚本

http://www.cyberciti.biz/tips/simple-linux-and-unix-system-monitoring-with-ping-command-and-scripts.html

并运行它

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

相关内容