Ubuntu

tail-pipe-awk 腳本,在 Centos 上很好,但在 Ubuntu 上很奇怪

  • November 20, 2013

我在 CentOS 上編寫了一個腳本,現在我試圖在 Ubuntu 上執行它,但它的行為出乎意料。這是我在 bash 下執行的腳本之類的東西:

sudo tail -F /var/opt/my-application/log/my-application.log |
awk '
BEGIN {
   ORS=" "
}
{ if ($8 ~ /MATCH-TEXT/) {
           # do a whole bunch of stuff here
           # like look in /proc and calculate CPU and interface stats
   };
};
} '

以前,當我的日誌的 $8 欄位中出現 MATCH-TEXT 行時,所有“做一大堆東西”(腳本的內容)都會發生,我會看到輸出。我的應用程序大約每秒生成一次 MATCH-TEXT 行(有時更多,有時更少),此腳本的輸出也是如此。

然而,現在,當我啟動這個腳本時,我很長一段時間都沒有輸出,然後我可能一次得到 30 行輸出。似乎腳本正在排隊接收到的日誌行,然後快速執行幾次,因為 CPU 和介面上的計算適用於“從一秒鐘前開始”而不是“從一秒鐘前開始”。

更奇怪的是,註釋掉 awk 命令的所有內容以將其替換為“print $0”(將整個腳本變成一個笨拙的 grep 命令)會產生相同的結果。所以我相信這是系統執行這個腳本的方式,而不是腳本本身的東西。

同時,在另一個視窗中,一個普通的“sudo tail -F my-application.log | grep MATCH-TEXT”每隔一秒左右就會得到輸出(正如預期的那樣)。

有什麼想法嗎?有什麼提示我應該開始尋找導致這種排隊行為的原因嗎?

如果這不是由於 的差異tail,那麼我同意 Hauke Laging 的觀點,認為這可能是一個緩衝問題。要刷新 的輸出緩衝區awk,請嘗試fflush()在您的列印語句之後添加,就像我在以下測試程式碼中所做的那樣:

tail -F /var/log/apache2/access_log | awk '{ if ($8 ~ /MATCH-TEXT/) { print $0; fflush(); }}'

mawk -W interactive 解決了我在 Debian Wheezy 上的問題。

   tail -f data.log | grep --line-buffered '$DataString' | mawk -W interactive -F "," '{print "var2", $2, "var4", $4}'

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