網站搜尋

如何每隔 X 秒無限次運行 Linux 命令


你是否曾經遇到過必須每隔幾秒重複執行特定 Linux 命令的情況?好吧,如果你還不知道,這個教程將教你如何操作。當然,你可以使用 shell 腳本或排程任務(cron jobs)來做到這一點。你也可以在特定的間隔重複執行 Linux 命令,而不必每次手動運行。這就是watch命令派上用場的地方。這個命令可以用來重複執行指定的命令,並監控輸出。簡單來說,我們可以使用 watch 命令每隔 X 秒執行一次 Linux 命令,並且它會持續在控制台顯示輸出,直到我們手動按下CTRL+C停止,或終止該進程,或強制重啟系統。默認情況下,指定的命令每 2 秒執行一次,或者你也可以設定自己選擇的時間間隔。

使用 watch 指令每隔 X 秒無限次執行 Linux 指令

watch 指令的語法是:

$ watch [options] command

以下我舉了幾個例子來教你在哪裡可以使用 watch 指令來重複執行特定的 Linux 指令。

範例 1:

假設你想每 2 秒執行一次 uptime 指令來監控系統運行時間。要做到這一點,只需執行:

$ watch uptime

範例輸出:

Every 2.0s: uptime                                     sk Wed Feb  9 20:14:46 2018

 20:15:46 up  2:38,  1 users,  load average: 0.41, 0.35, 0.46

這裡

  • 每 2.0 秒: uptime - uptime 指令將每 2 秒執行一次並顯示結果。
  • sk - 目前登入的使用者
  • 週三 2月 9 20:14:46 2018 - 我們執行命令時的當前日期和時間。

這將持續運行直到你手動結束它。要退出命令,請按 CTRL+C。

你也可以將 uptime 命令的輸出保存到檔案中。要這樣做,請執行:

$ watch `uptime` > uptime.txt

或

$ watch `uptime` > uptime.doc

當你想將系統的運行時間發送給技術支援以獲取幫助時,這可能很有用。

範例 2:

如我之前提到的,watch 命令預設每 2 秒執行一次程式。我們可以使用 -n 參數將其改為特定的間隔,例如 5 秒。

讓我們每五秒顯示一次檔案系統磁碟空間使用情況。

$ watch -n 5 df -h

範例輸出:

Every 5.0s: df -h sk: Wed May 9 20:19:09 2018

Filesystem Size Used Avail Use% Mounted on
dev 3.9G 0 3.9G 0% /dev
run 3.9G 1.1M 3.9G 1% /run
/dev/sda2 457G 357G 77G 83% /
tmpfs 3.9G 32M 3.9G 1% /dev/shm
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 3.9G 36K 3.9G 1% /tmp
/dev/loop0 83M 83M 0 100% /var/lib/snapd/snap/core/4327
/dev/sda1 93M 55M 32M 64% /boot
tmpfs 789M 28K 789M 1% /run/user/1000

要檢查此命令是否真的有效,請創建或刪除任何文件/資料夾。您會注意到在創建或刪除文件/資料夾後,輸出中的可用空間已經改變。

範例 3:

要查看目錄內容變化,請執行:

$ watch -d ls -l

在這裡,-d 或 --differences 標誌將會突出顯示連續更新之間的差異。

範例輸出:

total 3857440
-rw------- 1 sk users 1921843200 Apr 25 22:47 bionic-desktop-amd64.iso
-rw------- 1 sk users 1921843200 Apr 25 03:02 bionic-desktop-amd64.iso.zs-old
drwxr-xr-x 2 sk users 12288 May 8 18:45 Desktop
drwxr-xr-x 2 sk users 4096 Apr 20 16:54 Documents
drwxr-xr-x 11 sk users 4096 May 9 19:56 Downloads
drwxr-xr-x 2 sk users 4096 Jan 7 2017 Music
drwxr-xr-x 5 sk users 12288 Mar 23 17:34 Pictures
drwxr-xr-x 2 sk users 4096 May 11 2016 Public

此外,您可以顯示由特定使用者(例如 sk)擁有的目錄變更的內容。

$ watch -d 'ls -l | fgrep sk'

這在多使用者系統中可能很有用。

範例 4:

要顯示記憶體詳細資訊,請執行:

$ watch -d free -m

範例 5:

要每 10 秒顯示一次 du 命令的輸出,你可以使用:

$ watch -n 10 du -h

範例輸出:

Every 10.0s: du -h                                                                                                                              sk: Wed May 9 20:26:43 2018
17M     ./.disruptive innovations sarl/bluegriffon/q87d9o6v.default/extensions
16K     ./.dooble/Dooble
4.0K    ./.dooble/Histories
176K    ./.dooble
4.0K    ./.PlayOnLinux/wine/mono
13M     ./.PlayOnLinux/wine/gecko
4.0K    ./.PlayOnLinux/wine/linux-amd64
652K    ./.PlayOnLinux/wine/linux-x86/1.3.19/share/wine/fonts
872K    ./.PlayOnLinux/wine/linux-x86/1.3.19/share/wine

這個程式會每 10 秒監控一次磁碟使用情況,直到你手動退出它。

更多詳情,我建議你參考手冊頁。

$ man watch

使用 While 迴圈每隔 X 秒永遠執行一次 Linux 命令

你也可以在 While 迴圈的幫助下做到這一點。

要每 2 秒重複執行一個命令,持續不斷地運行,請執行:

$ while sleep 2 ; do uptime ; done

範例輸出:

21:10:21 up 10:12,  1 user,  load average: 0.83, 0.71, 0.59
21:10:23 up 10:12,  1 user,  load average: 0.76, 0.70, 0.59
21:10:25 up 10:12,  1 user,  load average: 0.76, 0.70, 0.59
21:10:27 up 10:12,  1 user,  load average: 0.70, 0.68, 0.58
[...]

使用 While 迴圈每隔 X 秒永遠執行一次 Linux 命令

結論

你現在知道如何使用 Watch 命令每隔 X 秒執行一次命令。一般來說,Watch 命令用於監控磁碟使用量和記憶體使用量。請不要將此命令與其他監控工具混淆。此命令的目的是每隔特定的秒數永久執行命令,直到你手動停止它。

相關閱讀:

  • 如何在 Linux 中重複執行命令直到成功