為什麼執行此腳本所需的時間在使用者和系統之間差異如此之大,我該如何糾正這種差異?
我的應用程序位於負載均衡器後面,每隔一段時間我喜歡在每台機器上進行狀態檢查,以了解在每台機器上返回 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
由於應用程序認為它是 on
domain.tomonitor.com
,我在 wget 請求標頭中手動設置它。它grep
是針對“真實”時間awk
的,並且僅將時間排除在外,將其轉儲到 $result 變數中。根據經驗,它似乎作為基本的手動檢查工作得很好——在我的各種伺服器上響應通常需要 2-3 秒,除非有一些不平衡的連接正在進行。我直接從我的 Mac OS X 筆記型電腦上針對我們的專用網路執行它。前幾天,我想知道是否可以使用 cron 隨時間記錄結果。我驚訝地發現它有亞秒級的響應,例如 0.003 秒。嘗試使用名為 Geektool 的 OS X 桌面小元件將腳本結果安裝到我的桌面,並看到類似的亞秒級報告。
time wget
我懷疑差異是由於某些使用者錯誤造成的——我正在執行的命令不起作用的某些原因。誰能告訴我為什麼執行此腳本所需的時間在使用者(我手動執行)和系統(cronjob 或 Geektool)之間差異如此之大,以及我如何糾正這種差異?
你沒有顯示你的 shebang 線,但根據你正在尋找的東西,我會說你在 Bash 下執行它。如果你沒有 shebang 線,你應該添加一個。Bourne shell 沒有內置
time
命令,因此它將使用/usr/bin/time
與 Bash 的內置命令不同的輸出格式time
。由於您使用的是 Bash,因此您可以
time
使用變數設置命令的輸出格式,TIMEFORMAT
因此您不需要使用grep
andawk
。我會使用花括號來避免創建子外殼可能增加的任何成本。#!/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
仍將轉到變數。