Unix

為什麼執行此腳本所需的時間在使用者和系統之間差異如此之大,我該如何糾正這種差異?

  • February 15, 2011

我的應用程序位於負載均衡器後面,每隔一段時間我喜歡在每台機器上進行狀態檢查,以了解在每台機器上返回 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因此您不需要使用grepand awk。我會使用花括號來避免創建子外殼可能增加的任何成本。

#!/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仍將轉到變數。

引用自:https://serverfault.com/questions/235501