如何在Linux中设置CRON作业以每10秒运行一次?

86

我需要从启动时间开始每隔10秒运行一个 CRON 作业。

在Linux中,如何在启动时每10秒运行一次 CRON 作业?

我正在尝试解决这个问题,如下所示:当我在04:28:34发出请求(或启动)时,它应该在04:28:44而不是4:28:40开始

这是我所做的:

# m h  dom mon dow   command
*/10 * * * * /usr/bin/wget http://api.us/application/

我做错了什么?为什么这个操作没有每10秒触发wget


如果在04:28:34提出了一个请求,而在04:28:37又提出了另一个请求,应该发生什么?在这种情况下,您需要两个请求还是只需要一个请求? - DCoder
@DCoder,这只有一个请求。在04:28:34发出的请求应该在04:28:44开始,而不是在04:28:40开始。 - dev1234
在这种情况下,从第二个请求的角度来看,请求是在7秒后发送的,而不是10秒。这样可以接受吗?它应该每隔10秒重复一次请求直到关闭服务器,还是需要在某个时间点停止? - DCoder
@DCoder 它应该在给定的时间停止。 - dev1234
4
使用一个shell脚本,cron不是这里的正确解决方案。 - scai
6个回答

139

进一步解释一下Sougata Bose的回答,我认为OP想要一个命令从开始时间每10秒运行一次,而不是在第一分钟之后每隔10秒运行一次。

cron只有1分钟的分辨率(我认为还有其他工具可以实现更细的分辨率,但它们在Unix上不是标准的)。

因此,为了解决您的问题,您需要6个cron作业,每个作业都带有睡眠功能。

例如,运行crontab -e并将以下行添加到所选编辑器中:

* * * * * ( /usr/bin/wget http://api.us/application/ )  
* * * * * ( sleep 10 ; /usr/bin/wget http://api.us/application/ )  
* * * * * ( sleep 20 ; /usr/bin/wget http://api.us/application/ )  
* * * * * ( sleep 30 ; /usr/bin/wget http://api.us/application/ )  
* * * * * ( sleep 40 ; /usr/bin/wget http://api.us/application/ )  
* * * * * ( sleep 50 ; /usr/bin/wget http://api.us/application/ )  

不确定这是否适用于Linux命令行,但在Java7及以上版本中,@Schedule Spring注释允许分辨率高达秒级。例如,这将每10秒触发一次您的任务: */10 * * * * ? 尝试向您的表达式添加一个额外的标记,看看是否有效。 - Ruben Daddario
下面的答案更加优雅,但还是谢谢。 - danone
3
Cron生成器 https://codepen.io/04/full/YzYLPqr - 井上智文

45

另一种选择是使用crontab -e命令编辑您的crontab,然后编写:

* * * * * for i in {1..6}; do /usr/bin/wget http://api.us/application/ & sleep 10; done

7
欢迎来到SO!下次,请在您的答案中多添加一点解释。 - B--rian
7
由于睡眠指令的执行是在命令完成后进行的,因此间隔时间可能会超过10秒,具体取决于命令执行的时间。这一点需要考虑到。 - D. Mika

27

*/10 * * * * 每隔10分钟运行一次。
*/10 * * * * * 每隔10秒钟运行一次。

您可以查看cron编辑器以获取更多选项。


28
这不起作用,供您参考。您会收到一个错误。 - Zach Rieck
6
不可行。Linux上的Cron不支持这种表示法。crontab.cronhub.io存在误导,它没有说明哪些平台支持此表示法。这在Mac上可以实现,但标准Linux服务器上不行。 - Kasun Rajapaksha
非常感谢,非常好用,准确地在每分钟的10秒、20秒等时刻触发——这正是我所需要的。 - danday74
4
我猜这在 Ubuntu 系统上不起作用。 - Nikhil VJ
1
这个答案是误导性的,它在 Ubuntu 系统上不起作用,正如 @NikhilVJ 所说的那样。请使用 https://crontab.guru/。 - Benson Okello
尽管这个问题是关于Linux的,但我在寻找node-cron的东西时来到了这里,而且它确实起作用了。谢谢。 - Ricardo Yubal

14

在秒字段中使用逗号也可以:

0,10,20,30,40,50 * * * * *

4
这个回答并没有像其他回答那样让我感到害怕,它很有效并需要更多的赞同。 - JackLeEmmerdeur
7
在Linux上它不能运行,在Ubuntu 20.04上测试后无法执行工作。正如其他回复中指出的那样,也许它能在Mac上运行,并且也适用于基于crontab注释的其他作业调度工具,但并不适用于Linux的crontab。 - Mariano Ruiz
1
不适用于Linux。 - Mikhail M.

6

请使用watch代替; 例如:

watch -n10 -x your_command

5

如果某个操作需要每10秒运行一次,不一定非得使用 cron job。可以写一个带有无限循环并且内部包含 sleep 的脚本,例如:

while true
do
  # or whatever command you need to run
  rm -rf /var/www/some-directory
  sleep 10
done

并使用以下命令运行

nohup bash my-endless-script.sh 

这个命令可以让程序在后台运行,即使你关闭了终端也会一直运行。

你可以用 kill 命令来停止该程序的运行。


Cronjob的优点是默认提供日志文件。 - till Kadabra
1
然而,缺点是它每分钟只能运行一次。 - Čamo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接