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.

在本教程中,您将学习一种简单的脚本技术,以监视或持续关注特定命令的运行状态,类似于每隔 3 秒连续监视进程和内存利用率的 top 命令(连续监视进程和内存利用率)。
我们不会停下来讨论为什么您需要如此频繁地运行命令的原因。我相信每个人在日常工作或甚至家用 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

如果您认为上述过程太复杂,无法实现,那么我建议您使用Advance copy command,它在复制时显示数据的进度。
2. 使用sleep命令
Sleep通常用于调试shell脚本,但它还有许多其他有用的用途。例如,与for
或while
循环结合使用时,您可以获得非常棒的结果。
如果您是bash脚本的新手,您可以查看我们关于bash循环的指南这里。
如果这是您第一次听说"sleep"
命令,它用于延迟指定时间。在脚本中,您可以使用它告诉您的脚本运行命令1,等待10秒,然后运行命令2。
通过上述循环,您可以告诉bash运行一个命令,休眠N秒,然后再次运行该命令。
下面您可以看到这两种循环的示例:
for loop Example
# 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 loop Example
# 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,这将非常有用。
重要提示:使用上述方法时,强烈建议设置足够长的间隔时间,以确保您的命令有足够的时间完成运行,然后再执行下一个。
结论
本教程中的示例很有用,但并不意味着完全取代cron实用程序。您可以自行决定哪种方法更适合您,但如果必须区分两种技术的用法,我会这样说:
- 在需要定期运行命令甚至在系统重新启动后仍然运行时,请使用cron。
- 请使用本教程中解释的方法来为旨在在当前用户会话中运行的程序/脚本进行操作。
如有任何问题或意见,请务必在下方评论区提交。
Source:
https://www.tecmint.com/run-repeat-linux-command-every-x-seconds/