這裡介紹如何在 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
參數指定執行指令的間隔時間,例如讓 watch
每 0.5
秒更新一次:
# 每 0.5 秒更新一次 watch -n 0.5 tail /var/log/httpd/error_log
watch
更新的間隔時間不可低於 0.1
秒。
如果程式每次執行時所輸出的資料只會有微小的差異,使用 watch
在觀看時可能會不容易發現其中的變化,這時候可以加上 -d
參數,讓 watch
將差異之處反白,讓使用者一眼就可辨識出有變動的部份。
# 標示輸出差異之處 watch -d ls -l
有些 Linux 的指令會使用 ANSI 顏色與樣式讓輸出更好看,例如 ls --color
就會把檔案依照類型上色,如果想讓 watch
的輸出也可以呈現惡些顏色與樣式,可以加上 -c
參數:
# 解析 ANSI 顏色與樣式 watch -c ls --color
如果要以 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
指令的作用。