我的应用程序位于负载均衡器后面,每隔一段时间我喜欢对每台机器进行状态检查,以了解每台机器返回 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
这样您就不需要使用grep
and 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
仍将进入变量。