如何在Linux上每X秒重复一次命令

在本文中,我将向您展示两种在Linux上每X秒重复一次命令的方法。 watch,并使用 sleep 所以 while 循环(使用一种避免长时间运行的命令时会导致时间滞后的方法)。

watch 您可以重复运行该命令以查看其输出和错误(全屏显示)。这使您可以监视程序输出随时间的变化。

使用 watch 每次执行命令 X 秒:

watch -n <X> <command>

哪里:

  • -n 指定时间间隔
  • X 执行命令的间隔(以秒为单位)(最小可能值为0.1秒)
  • command 您要执行的命令

如果命令包含管道,引号或其他特殊字符,请使用单引号,如下所示: 'command'..

例。执行以下命令 ps aux | grep firefox 每5秒:

watch -n 5 'ps aux | grep firefox'

该· watch 该命令具有多个选项,例如突出显示连续更新之间的差异(--differences / -d),如果命令的退出不为零,则发出哔声(--beep / -b), 更多。看看这个 手册页 欲获得更多信息。

您可能还会喜欢:如何使用“查找”查找最近N天或几分钟内已更改的文件

使用 sleep 所以 while 每X秒重复一次命令的循环

在Linux上每X秒重复一次命令的另一种方法是 while 与循环 sleep 命令:

while true; do <command>; sleep <X>; done

在这里需要更换 command 使用命令执行 X 时间间隔以秒为单位(数字不必为整数,但不能为负;您可以指定例如分钟-1m,小时-1h等)。

例。下一个班轮是 echo $(date) 每5秒命令一次:

while true; do echo $(date); sleep 5; done

如果您要执行更复杂的操作,请确保间隔小于完成命令所需的时间。否则,它可能会干扰脚本中的某些内容。

同样重要的是要注意,使用此功能时,时间会根据您要执行的命令完成所需的时间而变化。例如,如果您希望命令每5秒运行一次,但是该命令需要3秒钟才能完成,则该命令每8秒而不是每5秒运行一次。

避免此时间延迟并每X秒执行一次命令的解决方案,无论完成时间长短(除非命令完成的时间长于睡眠时间),都应使用以下方法:是。

while true; do <command>; sleep $((<X> - $(date +%s) % <X>)); done

在这里替换 command 您要执行的命令和 X 需要重复命令的秒数。

[[Edit]]此解决方案并不完美。阅读本文后面的带标记的编辑中的描述和替代方法。

例。下一个班轮是 sleep 3 命令(我想不出一个更好的示例,该命令需要几秒钟的时间才能完成,并且在用户没有凌晨5点停止输入的情况下也不会造成破坏),每5秒一次:

while true; do sleep 3; sleep $((5 - $(date +%s) % 5)); done

这样,您可以使用命令(sleep 3 在这种情况下,您可以使用任何命令)需要3秒才能完成,执行间隔为5秒。

为了测试 echo $(date) 最初,它看起来像这样:

while true; do echo $(date); sleep 3; sleep $((5 - $(date +%s) % 5)); done

终端上显示的日期以5秒为增量显示,如下所示。

Thu 10 Dec 05:48:00 2020

Thu 10 Dec 05:48:05 2020

Thu 10 Dec 05:48:10 2020

Thu 10 Dec 05:48:15 2020

[[Edit]]但是这种解决方案并不完美。 第一轮和第二轮之间的时间间隔可能短于指定的时间间隔。但是,后续运行将使用正确的时间间隔。如果您知道执行此操作的更好方法,请在下面发表评论。

[[Edit]]解决方案(通过 堆叠交换)这避免了时间漂移,并且没有上述问题(因此,第一轮和第二轮之间没有不同的时间间隔), sleep 该命令是以下一线代码:

while true; do currentTime=$(date +%s); elapsedTime=$((currentTime - lastTime)); if [ $elapsedTime -ge <X> ]; then <command>; lastTime=$currentTime; i=0; fi; done

交换 X 运行之间的时间间隔(以秒为单位),以及 command 使用要每X秒重复一次的命令。

这里需要一些解释。这个 while 该循环按如下方式存储当前的Unix时间: currentTime,然后减去上一次(lastTime)从当前时间开始,保存如下 elapsedTime..然后检查经过时间是否相等 X 如果是这样,它将被执行 command (因此,每次都会重复执行该命令 X 秒)。最后,它将上次时间设置为等于当前时间,以便下次运行时可以减去它 lastTimecurrentTime,这是 elapsedTime 值。希望这对您有意义,就像我心中的😁️一样。

例。下一个班轮是 echo $(date)sleep 2 命令(我用过 sleep 2 因此,该命令将花费几秒钟来完成,您将能够看到时间是否在漂移(每5秒钟一次):

while true; do currentTime=$(date +%s); elapsedTime=$((currentTime - lastTime)); if [ $elapsedTime -ge 5 ]; then echo $(date); sleep 2; lastTime=$currentTime; i=0; fi; done

您可能还会喜欢:如何使用find删除早于或超过N天的文件(包括其他示例)

Sidebar