如何永久每隔 X 秒运行或重复一个 Linux 命令
系统管理员经常需要在一定时间内重复运行某个命令。通常,这类任务可以通过简单的cron 命令轻松完成。在大多数情况下,这应该可行,但运行 cron 命令的最短周期是每 1 分钟一次。信不信由你,在很多情况下,这太慢了。
在本教程中,您将学习一种简单的脚本技术,以监控或关注连续运行状态下的特定命令,类似于top 命令(连续监控进程和内存利用率),默认每 3 秒一次。
我们不会停下来讨论为什么你需要如此频繁地运行命令。我相信每个人在日常工作中甚至在家用电脑和笔记本电脑上都有不同的理由。
1.使用watch命令
Watch是一个 Linux 命令,它允许您定期执行命令或程序,并在屏幕上显示输出。这意味着您将能够及时看到程序输出。默认情况下,watch 每 2 秒重新运行一次命令/程序。可以轻松更改间隔以满足您的要求。
监视内存使用情况
“Watch” 非常容易使用,要测试它,您可以立即启动 Linux 终端并输入以下命令:
# watch free -m
上述命令将检查您的系统可用内存,并每两秒更新一次free 命令的结果。
从上面的输出中可以看出,你有一个标题,显示有关(从左到右)更新间隔、正在执行的命令和当前时间的信息。如果你想隐藏这个标题,你可以使用选项-t
。
下一个合乎逻辑的问题是 – 如何更改执行间隔。为此,您可以使用选项-n
,指定执行命令的间隔。此间隔以秒为单位指定。假设您想script.sh
每 10 秒运行一次文件,您可以这样做:
# 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/example/ & # watch -n 0.1 du -s /home/example/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 ,那么这个命令就派上用场了。
重要提示:使用上述方法时,强烈建议您设置足够长的间隔,以便在下次执行之前给命令足够的时间完成运行。
结论
本教程中的示例很有用,但并不意味着完全取代cron 实用程序。您可以自行选择最适合自己的方法,但如果我们必须区分这两种技术的使用,我会这样说:
- 当您需要在系统重启后定期运行命令时,请使用 cron。
- 对于要在当前用户会话中运行的程序/脚本,请使用本教程中介绍的方法。
与往常一样,如果您有任何问题或意见,请随时在下面的评论部分提交。