在 ping 命令的每个输出行后执行命令

在 ping 命令的每个输出行后执行命令

我正在尝试构建一个单行命令来监视我的互联网连接何时下降。

我希望这样,如果我ping www.google.com无限期地运行(每秒一次 ping),如果输出行中存在“超时”一词,则另一个命令会运行,但该ping命令会继续无限期地运行。

我在 OS X 上运行这个命令,所以另一个命令是say fail这样,如果我不看终端窗口,我可以听到有问题。

如果它不能是一行命令,那么 bash 脚本就可以了。

我试过这个:

ping www.google.com | grep timeout ; say fail

但只有say在用户手动终止ping命令后才会执行该命令。

然后我尝试了这个:

if ping www.google.com | grep timeout ; then say fail ; fi

但这永远不会执行该say命令。

答案1

您的问题来自于永不退出的 ping 命令。

ping您应该创建一个需要进行一次测试的循环-c 1

while [ true ] ; do if ping -c 1 www.google.com | grep timeout ; then say fail ; fi ; sleep 1 ; done

编辑

  • 我写了一个bashwhile 循环,也许你应该让它适应你的 shell 程序(我玩 mac os X 已经很长时间了),
  • 我添加了一些暂停(一秒)以防止循环消耗太多CPU...

相关内容