這裡介紹如何在 Linux 系統中使用 watch 自動重複執行特定程式,監看輸出結果。

當我們在 Linux 的終端機中工作時,有時後會需要重複執行某些固定的指令,查看最新的執行結果,例如在進行網頁伺服器得除錯工作時,我們可能就會重複執行這樣的指令,監看錯誤訊息紀錄檔:

# 輸出最新的網頁伺服器錯誤訊息
tail /var/log/httpd/error_log

當然我們可以重複的按下向上的方向鍵,然後按下 Enter 執行,但其實有更好的辦法,就是使用 watch 將這個動作自動化。

watch 重複執行固定指令

watch 是一個專門用來重複執行固定指令,並且監看輸出訊息的小工具,以上面監看網頁伺服器錯誤訊息紀錄檔的例子來說,我們就可以使用 watch 來執行:

# 自動監看最新的網頁伺服器錯誤訊息
watch tail /var/log/httpd/error_log

watch 會不斷的自動重複執行指定的指令,並將最新的輸出顯示化畫面上。

監看錯誤訊息紀錄檔

在輸出的畫面上方會標示目前 watch 所執行的指令內容、間隔時間,以及上一次執行的時間點,這個畫面會自動更新,使用者可以很方便的看到最新的結果。

更新速度

在預設的狀態下,watch 會每間隔幾秒鐘執行一次指令(不同的系統預設值不同),產生最新的輸出訊息,若要加快或放慢更新的速度,可以使用 -n 參數指定執行指令的間隔時間,例如讓 watch0.5 秒更新一次:

# 每 0.5 秒更新一次
watch -n 0.5 tail /var/log/httpd/error_log

watch 更新的間隔時間不可低於 0.1 秒。

標示輸出差異處

如果程式每次執行時所輸出的資料只會有微小的差異,使用 watch 在觀看時可能會不容易發現其中的變化,這時候可以加上 -d 參數,讓 watch 將差異之處反白,讓使用者一眼就可辨識出有變動的部份。

# 標示輸出差異之處
watch -d ls -l

標示輸出差異之處

解析 ANSI 顏色與樣式

有些 Linux 的指令會使用 ANSI 顏色與樣式讓輸出更好看,例如 ls --color 就會把檔案依照類型上色,如果想讓 watch 的輸出也可以呈現惡些顏色與樣式,可以加上 -c 參數:

# 解析 ANSI 顏色與樣式
watch -c ls --color

解析 ANSI 顏色與樣式

監看管線串接的指令

如果要以 watch 監看以管線串接的指令,可以將管線的串接的指令包在引號中,例如:

# 列出最近有更改過的檔案
watch -n 1 "ls -ltr | tail -n20 | tac | nl"

這個指令會列出目前目錄中的檔案,依照更改時間排序(新更改的檔案放在後面),接著交給 tail 取出最後更動的 20 個檔案,再使用 tac 將檔案反序輸出(將後來更改的檔案排在上方),最後以 nl 加上行號輸出。

把這個管線串接的指令交給 watch 來執行後,就可以持續監控目前目錄的檔案狀態。

列出最近有更改過的檔案

關閉標頭行

如果不想讓 watch 顯示上方的標頭行,以節省空間,可以加上 -t 參數,例如:

# 關閉標頭行
watch -t ls

關閉標頭行

實用範例

從網頁伺服器的紀錄檔篩選出來自於 192.168.0.123 的最新瀏覽紀錄:

watch grep -F 192.168.0.123 /var/log/httpd/access_log

grep -F 代表不使用正規表示法,以一般文字比對的意思,等同於 fgrep 指令的作用。