A system administrator often needs to run a command repeatedly in a certain periods of time. Often such tasks can be easily completed with simple cron commands. In most of the cases this should work, but the shortest period which you can run cron command is every 1 minute. Believe it or not, in many cases this is too slow.

在这篇教程中,你將學習到一個簡單的腳本技巧,用來監控或密切关注特定命令在持續運行狀態,類似於top命令(持續監控process及記憶體利用率),預設每3秒一次。
我們不會停下来討論為什麼你需要如此頻繁地運行命令。我相信每個人因為他們日常工作和甚至家庭PC或筆記本電腦中有不同的理由。
1. 使用watch命令
Watch 是個Linux命令,可以讓您定期執行命令或程序,並將結果顯示在屏幕上。這意味著你將能夠及时看到程序的輸出。預設情況下,watch命令每2秒重運行一次。間隔可以輕鬆更改以滿足你的需求。
監控記憶體使用
“Watch”非常容易使用,來測試它,你可以立馬打开一個Linux終端並輸入以下命令:
# watch free -m
以上命令將檢查系統的空閒記憶體,並每兩秒更新free命令的結果。

如上方輸出所示,你有一個頭部,顯示關於(從左到右)更新間隔、正在執行的命令以及當前時間的信息。如果你希望隱藏這個頭部,你可以使用-t
選項。
下一个邏輯性问题 是 – 如何更改执行间隔。为此目的,您可以使用 -n
选项,该选项指定了命令执行的间隔。这个间隔用秒来指定。所以,如果您想每10秒运行一次您的 script.sh
文件,您可以这样做:
# watch -n 10 script.sh
注意 如果像上面那样运行命令,您需要 cd
到包含脚本的目录(学习 学习15个cd命令示例)或者指定该脚本的完整路径。
watch 命令的其他有用选项包括:
-b
– 如果命令退出非零,则创建蜂鸣声。-c
– 解释ANSI颜色序列。-d
– 突出显示命令输出的变化。
监控登录用户、运行时间和负载平均值
假设您想每几秒钟连续阶段监控登录用户、服务器运行时间和负载平均值输出,则使用以下命令:
# watch uptime

要退出命令,请按 CTRL+C
。
在这里,'uptime'
命令将每2秒默认运行并显示更新后的结果。
监控复制命令的进度
在Linux中,使用cp
命令从一个位置复制文件到另一个位置时,不会显示数据的进度。要查看正在复制的数据进度,可以使用watch
命令结合du -s命令实时检查磁盘使用情况。
# cp ubuntu-15.10-desktop-amd64.iso /home/tecmint/ & # watch -n 0.1 du -s /home/tecmint/ubuntu-15.10-desktop-amd64.iso

如果您认为上述过程过于复杂,那么我建议您使用高级复制命令,它会在复制时显示数据的进度。
2. 使用sleep命令
Sleep通常用于调试shell脚本,但它还有许多其他有用的用途。例如,当与for
或while
循环结合使用时,可以得到非常棒的结果。
如果您对bash脚本编写还不熟悉,可以查看我们的bash循环指南这里。
如果这是您第一次听说"sleep"
命令,它用于延迟指定时间。在脚本中,您可以使用它来告诉您的脚本运行命令1,等待10秒,然后运行命令2。
通过上述循环,您可以告诉bash运行一个命令,休眠N秒,然后再次运行该命令。
下面是两个循环的示例:
for 迴圈示例
# for i in {1..10}; do echo -n "This is a test in loop $i "; date ; sleep 5; done
上面的一行程式碼將运行echo 命令並顯示當前日期,總共10次,每次執行之間休息5秒。
以下是示例輸出:
This is a test in loop 1 Wed Feb 17 20:49:47 EET 2016 This is a test in loop 2 Wed Feb 17 20:49:52 EET 2016 This is a test in loop 3 Wed Feb 17 20:49:57 EET 2016 This is a test in loop 4 Wed Feb 17 20:50:02 EET 2016 This is a test in loop 5 Wed Feb 17 20:50:07 EET 2016 This is a test in loop 6 Wed Feb 17 20:50:12 EET 2016 This is a test in loop 7 Wed Feb 17 20:50:17 EET 2016 This is a test in loop 8 Wed Feb 17 20:50:22 EET 2016 This is a test in loop 9 Wed Feb 17 20:50:27 EET 2016 This is a test in loop 10 Wed Feb 17 20:50:32 EET 2016
您可以將echo和date命令更改為您自己的命令或腳本,並根據需求更改休息間隔。
while 迴圈示例
# while true; do echo -n "This is a test of while loop";date ; sleep 5; done
以下是示例輸出:
This is a test of while loopWed Feb 17 20:52:32 EET 2016 This is a test of while loopWed Feb 17 20:52:37 EET 2016 This is a test of while loopWed Feb 17 20:52:42 EET 2016 This is a test of while loopWed Feb 17 20:52:47 EET 2016 This is a test of while loopWed Feb 17 20:52:52 EET 2016 This is a test of while loopWed Feb 17 20:52:57 EET 2016
上述命令將運行,直到它被用戶杀死或中斷。如果您需要在后台運行的命令,並且不想依賴於cron,這會很有用。
重要:當使用上述方法時,建議您 Set the interval long enough to give enough time for your command to finish running before the next execution.
結論
本教程中的示例很有用,但並不代表它們可以完全取代cron 工具。您需要決定哪一個對您來說比较好,但如果我們必須分離這兩種技術的用法,我會說:
- 當您需要在系統重新啟動後定期運行命令時,請使用cron。
- 使用本教程中解釋的方法來運行設計用於當前用戶會話的程序/腳本。
如果您有任何問題或意見,請隨時在下面的評論部分提交。
Source:
https://www.tecmint.com/run-repeat-linux-command-every-x-seconds/