为什么运行这个脚本花费的时间在用户和系统之间差别很大,我怎样才能纠正这个差异呢?

我的应用程序位于负载均衡器的后面,每隔一段时间我都希望对每台计算机进行状态检查,以了解每台计算机上返回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独自的时间,倾倒到一个$ resultvariables。 从经验上讲,它似乎作为一个基本的手动检查工作相当不错 – 我的各种服务器的响应时间通常需要2-3秒,除非有一些不平衡的连接正在进行。 我直接从我的Mac OS X笔记本电脑对我们的专用networking运行它。

有一天,我想知道是否可以使用cronlogging结果。 我惊讶地发现它有亚秒级的反应,例如0.003秒。 尝试使用名为Geektool的OS X桌面组件将脚本结果安装到我的桌面,并看到类似的亚秒级报告。

我怀疑差异是由于一些用户错误 – 为什么我运行的time wget命令的一些原因将无法正常工作。 任何人都可以告诉我为什么运行这个脚本所花费的时间与用户(我手动运行)和系统(cronjob或geektool)之间的差异如此之大,以及我如何纠正这种差异?

你不显示你的剪贴线,但根据你的意图,我会说你在Bash下运行。 如果你没有shebang线,你应该添加一个。 Bourne shell没有内置的time命令,因此它将使用具有与Bash内置time不同的输出格式的/usr/bin/time time

既然你使用的是Bash,你可以使用TIMEFORMATvariables来设置time命令的输出格式,所以你不需要使用grepawk 。 我会使用花括号来避免任何创build子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运行脚本可能会向您发送错误消息,但可以通过进行以下更改来logging它:

  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的输出仍然会到达variables。