网站搜索

如何永远每隔 X 秒运行或重复一次 Linux 命令


系统管理员经常需要在一定时间内重复运行某个命令。通常,此类任务可以使用简单的 cron 命令轻松完成。在大多数情况下,这应该有效,但您可以运行 cron 命令的最短周期是每 1 分钟一次。不管你相信与否,在很多情况下这太慢了。

在本教程中,您将学习一种简单的脚本技术,以默认每 3 秒监控或关注处于连续运行状态的特定命令,类似于 top 命令(持续监控进程和内存利用率)。

我们不会停下来讨论原因,为什么您需要如此频繁地运行命令。我相信每个人在日常工作甚至家庭电脑和笔记本电脑中都有不同的原因。

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 命令的其他有用选项是:

  1. -b – 如果命令的退出非零,则发出蜂鸣声。
  2. -c – 解释 ANSI 颜色序列。
  3. -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 脚本,但它还有许多其他有用的用途。例如,当与 forwhile 循环结合使用时,您可以获得非常棒的结果。

如果您不熟悉 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

您可以使用自己的命令或脚本更改 echodate 命令,并根据需要更改睡眠间隔。

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 实用程序。您可以选择哪一种更适合您,但如果我们必须区分这两种技术的使用,我会这样说:

  1. 当您需要定期运行命令(甚至在系统重新启动后)时,请使用 cron。
  2. 对于要在当前用户会话中运行的程序/脚本,请使用本教程中介绍的方法。

一如既往,如果您有任何问题或意见,请随时在下面的评论部分提交。