为什么运行此脚本所需的时间在用户和系统之间差别如此之大以及如何纠正这种差异?

为什么运行此脚本所需的时间在用户和系统之间差别如此之大以及如何纠正这种差异?

我的应用程序位于负载均衡器后面,每隔一段时间我喜欢对每台机器进行状态检查,以了解每台机器返回 index.html 文档所需的时间。

脚本如下:

   for host in 192.168.0.7 192.168.0.8 192.168.0.9; do
      result=$( ( time wget -q --header="Host: domain.tomonitor.com" http://$host/ ) 2>&1 | grep real | awk '{print $2}' )
      date=$(date)
      echo "$date, $host, $result"
   done

由于应用程序认为它处于开启状态domain.tomonitor.com,因此我在 wget 请求标头中手动设置了该值。它grep表示“实际”时间,并awk单独输出时间,将其转储到 $result 变量中。从经验上看,它似乎可以很好地用作基本的手动检查 - 响应通常需要 2-3 秒才能在我的各个服务器上完成,除非存在一些不平衡的连接。我直接从我的 Mac OS X 笔记本电脑针对我们的私人网络运行它。

前几天,我想知道我是否可以使用 cron 记录一段时间内的结果。我惊讶地发现它有亚秒级的响应,例如 0.003 秒。尝试使用名为 Geektool 的 OS X 桌面小部件将脚本结果安装到我的桌面,结果报告了类似的亚秒级时间。

我怀疑这种差异是由于某些用户错误造成的——某些原因导致time wget我运行的命令无法正常工作。有人能告诉我为什么用户(我手动运行)和系统(cronjob 或 Geektool)运行此脚本所需的时间相差如此之大,以及我如何纠正这种差异?

答案1

您没有显示您的 shebang 行,但根据您 grep 的内容,我认为您正在 Bash 下运行此命令。如果您没有 shebang 行,则应添加一个。Bourne shell 没有内置命令,time因此它将使用/usr/bin/time与 Bash 内置的 具有不同输出格式的time

time由于您使用的是 Bash,因此可以使用变量设置命令的输出格式,TIMEFORMAT这样您就不需要使用grepand awk。 我会使用花括号来避免创建子 shell 可能增加的任何开销。

#!/bin/bash
TIMEFORMAT=%R
for host in 192.168.0.7 192.168.0.8 192.168.0.9; do
    result=$( { time wget -q --header="Host: domain.tomonitor.com" http://$host/; } 2>&1 )
    date=$(date)
    echo "$date, $host, $result"
done

我不熟悉 Geektool,所以我不知道它如何影响您的结果。但是,上述更改可能会使脚本在环境之间更一致地工作。您是否考虑过服务器的连接性是否真的好得多?

另一件要检查的事情是查看您是否获得了对wget命令的预期响应。时间太短有时表示您遇到了错误。运行脚本cron可能会向您发送错误,但您可以通过进行以下更改来记录它:

    result=$( { time wget -q --header="Host: domain.tomonitor.com" http://$host/ >/tmp/wget.$$.out 2>&1; } 2>&1 )

这会将 的输出和错误消息放入wget名为“/tmp/wget.PID.out”的文件中,其中“PID”是数字进程 ID。 的输出time仍将进入变量。

相关内容