我是bash脚本的新手。
我需要一个脚本来获取ping到IP的毫秒数,如果时间超过100,它将打印一条回显消息。
例如,让我们使用google ip 8.8.8.8
你能帮帮我吗?
编辑:
好吧,怎么把它做成这样:
#!/bin/sh
echo '>> Start ping test 2.0'
/bin/ping 8.8.8.8 | awk -F' |=' '$10=="time"'
if [$11>100]
then
echo "Slow response"
else
echo "Fast response"
fi
4条答案
按热度按时间vd8tlhqk1#
首先,你不是在写bash脚本,你的脚本是使用
#!/bin/sh
调用的,所以即使你的系统使用bash作为它的系统shell,它也是在sh兼容模式下运行的。所以你不能使用bashisms。按照我下面所示的方法写你的脚本。所以......在我看来,如果你想让你的
ping
有由你的脚本处理的输出,那么ping
实际上需要退出。你的if
永远不会得到处理,因为ping
永远不会停止运行。而且,awk脚本中的$11
与shell脚本中的$11
是不同的。所以类似这样的操作可能会起作用:在shell(或bash)中,while循环每五秒运行一次ping,只发送一个数据包(
-c 1
),并使用sed
解析其输出。sed
脚本的工作原理如下:/.*time=/{...}
-查找包含时间的行,并在该行的花括号中运行内容...s///
-将先前找到的表达式(时间)替换为空(将其从行中删除)s/\..*//
-将从第一个句点到行尾的所有内容替换为空(因为shell数学只处理整数)p
-并打印该行的其余数据。另一种处理方法是将
ping
的输出解析为 stream,而不是为每个测试生成一个新的ping进程。例如:这些解决方案有一点问题,因为当连接完全消失时,它们无法报告。但也许你也可以调整它们来处理这种情况。
请注意,这些可能不是你的最佳解决方案。如果你真的想要一个监控系统,更大规模的东西,如Nagios,Icinga,Munin等,是一个很好的方法。
对于像这样的小规模ping监视,您可能还需要查看fping。
ars1skjm2#
您需要对
ping
的输出进行一些转换,以获得毫秒的实际数值。首先,为了简化此操作,请使用
ping
的-c 1
标志,以便仅发送一个数据包。ping
的输出如下所示:由于您需要'41.101'片段,因此需要解析出 * 第二行 * 的 * 倒数第二个元素 *。
要提取第二行,可以使用
awk
中的FNR
变量;要获取倒数第二列,可以使用NF
(字段数)变量。这将给予
time=41.101
,要仅获得数字,请使用cut
提取等号后面的字段cbjzeqam3#
这就是我所做的,以获得跟踪慢ping时间,也得到一封邮件发送给我或任何人,如果你想有。
vql8enpb4#
下面是我从不同的例子中提取的一个脚本。