【问题标题】:Hide statistics of ping command. (Server monitoring script)隐藏 ping 命令的统计信息。 (服务器监控脚本)
【发布时间】:2021-03-16 16:53:59
【问题描述】:

我想编写一个 bash 脚本来监控我的服务器的状态。

目前我有以下行来记录 ping:

ping -c 1 google.com | grep -A 1 "bytes from" | xargs -L 1 -I '{}' date '+"%F %T" {}' >> ping.log

不幸的是,grep 过滤器也过滤掉了错误消息,但我只想删除第一行和摘要。

"2020-12-04 15:46:00" 64 bytes from 216.58.208.110 (216.58.208.110): icmp_seq=1 ttl=37 time=16.2 ms
"2020-12-04 15:47:00" Request Timed Out.

是否有另一种方法可以仅抑制 ping 摘要,以便将错误消息也添加到我的日志中?

【问题讨论】:

  • 错误消息写入标准错误,而不是标准输出。在管道之前使用2>&1 重定向它。

标签: bash logging stdout ping stderr


【解决方案1】:

我确信 ping 和 stderr 有一些奇怪的地方,因为我一直试图抑制所有消息(因为我使用返回码进行其他处理)。 我这样做是因为来自 cron 任务的任何消息都会导致 root 邮件,虽然可以很好地发现问题,但这并不是我想要捕获 ping 失败的方式。

我得到了这些结果:

ping -q -c 3 ians.guess-fail.com 2>&1 >/tmp/ping.txt
ping: ians.guess-fail.com: Name or service not known
ping -q -c 3 ians.guess-fail.com 2>&1 >/dev/null
ping: ians.guess-fail.com: Name or service not known
ping -q -c 3 ians.guess-fail.com 2>/dev/null >/tmp/ping.txt
# No output/messages produced!!!

我不知道为什么...但我将使用最后一个示例。

【讨论】:

    【解决方案2】:

    尝试使用 awk(在本例中为 GNU awk)等等:

    ping -c 1 www.google.co.uk | awk '/^---/ { exit } NR > 1 && !/^$/ { print strftime("%F %T")" "$0 }'
    

    获取 ping 输出并仅打印第二行,即非空白行,然后在我们到达摘要开头(以 --- 开头)时退出。对于所有其他行,打印以日期为前缀的行,使用 awk 的 strftime 函数构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 2011-09-05
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多