如何每5秒运行一次脚本?


66

我有一个脚本,需要每五秒钟运行一次。我知道那cron可以在分钟内完成任务,但是有没有办法每秒运行某件事?


3
您想解决什么问题?您确定cron是正确的解决方案?
andol 2010年

1
我知道cron不是正确的解决方案。我说的不是问题。请阅读。我正在尝试使脚本每5秒运行一次。
myusuf3

2
抱歉,我想这个问题有点不对。但是,仍然想知道您是否正在尝试解决正确的问题。
andol 2010年

对于来这里的人们来说,每5秒就会运行一次。我强烈建议您改为学习如何使用socket.io之类的工具进行实时编程。
布兰登·贝特尔森

您是否发现了bash sleep命令? sleep 5暂停(可能在一个循环中)5秒钟)...?
SDsolar

Answers:


64

Cron仅允许至少一分钟。您可以做的是编写一个带有无限循环的Shell脚本,该脚本运行您的任务,然后休眠5秒钟。这样,您的任务将每5秒或多或少运行一次,具体取决于任务本身需要花费多长时间。

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

您可以my-task.sh使用上面的内容创建一个文件,然后使用运行该文件sh my-task.sh。(可选)您可以将其配置supervisor为服务,以便在系统启动等时启动。

听起来确实确实在做某些您可能不应该做的事情。这感觉不对


一个人可能需要每5秒钟或更短的时间运行一次cron,以用于基于PHP的刮板。
拉维什·库玛

真的感觉不对。如果将其包含在cron作业中,则每分钟将有重叠的作业。一个小时后,每5秒钟将启动60个工作。如果您不包括在cron作业中,那么您可能不知道如何停止它,甚至无法知道它的存在。
SeF

35

您可以cron每分钟就有一个工作启动脚本,从而启动12个后台进程:

* * * * * ~/dostuff.sh

dostuff.sh

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

不过,我的问题是,每5秒钟运行一次,您在地球上能做什么


1
好吧,当我制作一个脚本来反复检查/media目录中是否插入了用于自动备份的USB驱动器时,这对我很方便...
VF1 2013年

32
What on EARTH-统计信息,垃圾收集,文件同步,在线状态,您可以为它命名。
ruX 2016年

3
引用外部API以获得近乎实时的数据。每5秒钟执行一次请求要比在每次浏览量上执行请求要好得多。
谢尔盖·库德里亚夫采夫

1
如果crontab执行两次dostuff.sh文件怎么办?例如,在第55秒,脚本已执行但尚未完成,但是cron再次调用了脚本,会发生什么?
TomSawyer

2
这不好!它可能一次运行该脚本多次(如果花费的时间超过5秒),这可能导致所访问的任何文件(甚至是临时文件)都出现竞争状态。如果同时做两次相同的事情可能会引起问题,请勿这样做!(通常会这样!)
Nonny Moose

27

只需使用一个循环:

while true ; do ./your-script & sleep 5; done

这将启动您的脚本作为后台作业,睡眠5秒钟,然后再次循环。您可以使用Ctrl-C中止它,或使用其他任何条件代替true,例如! test -f /tmp/stop-my-script仅在文件/tmp/stop-my-script不存在时循环。


如果我包括“&”号,它将显示为bash: syntax error near unexpected token ';',因此我将其取出。我有bash 4.3.11。我的命令运行很快,因此可以在前台运行。
泰勒·科利尔

1
@TylerCollier如果确实需要./your-script在后台运行(在5秒钟的睡眠过程中),则可以保留&但将其删除;。作为&用于分离命令的目的,这是不必要的(显然不允许)具有;后它在同一行上。另一种方法是在多行中编写循环(在换行符之后&以及(也可以选择在换行符之后do和之前done)换行)。由于;之后&似乎是一个错字,因此我将其删除。blueyed:;如果您确实需要,请随时放回它;如果是这样,我建议还添加一个解释。
伊利亚·卡根

@EliahKagan FWIW,它可在Zsh上运行(无语法错误),但并不是必须的。感谢您的编辑!
blueyed

10

您可以使用GNU软件包mcron,这是“ Vixie cron”的替代方案。

http://www.gnu.org/software/mcron/manual/mcron.html#Top

“可以轻松地指定更精细的时间点,即秒。原则上可以延长至微秒,但未实现。”


那正是我想要的。谢谢!
SDsolar

请在此处将其发布为我的问题的答案: askubuntu.com/questions/922216/…,以便我接受您的回答。
SDsolar



mcron需要sendmail默认安装并激活。如何禁用它?
ihsan


2

使用仙人掌来监视路由器和交换机,但是Cron仅允许至少一分钟,因此,如果一个端口/设备出现故障,则直到两分钟后才发出警告。


1
我建议编辑此答案以将其扩展为有关如何执行此操作的特定详细信息。(另请参阅“我如何编写一个好的答案?”,以获取有关在Ask Ask Ubuntu上认为哪种答案最有价值的一般建议。)
David Foerster,2016年

2

您可以使用SystemD计时器单元,它每5秒钟触发一次服务-您已将其设置为执行所需的操作。

假设您的服务单元已被调用mystuff.service并安装到其中/etc/systemd/system(如果要替换用户的crontab,请签出SystemD用户服务),然后可以编写一个计时器单元以在启动时然后每5秒运行一次该服务,如下所示:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

然后重新加载systemd配置,启用计时器单元并启动它。


1
这是最好的解决方案,唯一的缺点是cron易于概述和配置。SystemD是一个痛苦,它始于它的目录结构。仍然是5秒间隔的最佳时间
约翰·约翰(John John)

上面的代码片段不会在/etc/systemd/system/mystuff.timer中而不是mystuff.service中吗?
布鲁克斯

@布鲁克斯:是的,我不好-不好复制并粘贴在我这一边。固定。
格斯

谢谢...很高兴知道我在学习systemd时并不发疯:)
Brooks

1

我已经非常成功地完成了此类操作(最终结果一次运行了数周,直到重新启动计算机为止)。至于我现在正在做什么,请更新信息并将其放入缓存-每10秒更新一次。

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

'exec $ 0'重新启动脚本,但替换正在运行的脚本。最初可以使用crontab'@reboot'行启动。


8
为什么不使用while循环而不是反复重新启动脚本?
David Z
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.