我需要构建一个cron表达式,以便在用户单击开始按钮后每10分钟运行一次作业。
我尝试做类似的事情:
0 42/10 * * * ? *
42/10就像用户点击开始hh:42(例如:18h42)。下一个时间表如下:
1. Friday, March 20, 2015 6:42 PM
2. Friday, March 20, 2015 6:52 PM
3. Friday, March 20, 2015 7:42 PM
4. Friday, March 20, 2015 7:52 PM
5. Friday, March 20, 2015 8:42 PM
问题是在第二次执行后,作业等待一个小时才能执行下一次执行。我如何构建一个立即启动并在N分钟后仍然运行的cron表达式?
提前感谢。
答案 0 :(得分:3)
我认为你的格式错了。字段的顺序是:
因此,在您的示例中,Minute
为0,而您的Hour
无效(Hour
必须在0-23
范围内)。我猜cron忽略了错误的Hour
,并且每小时都在Minute 0
上运行。
但是,如果您确实希望每隔 N 分钟运行一次,则可以使用类似的格式(其中 N 小于60):
0/N * * * * /bin/echo "Your Command Here"
但是,请记住/N
在当前小时内每 N 分钟重复一次命令。因此,如果您的crontab中有0/33
,则命令将在以下位置运行:
不在:
答案 1 :(得分:1)
如果您想每n
分钟运行一次cron,有三种情况需要考虑:
n
分钟(60分可被n
整除)n
(通用)YYYY-MM-DD HH:MM:00
分钟
由于一个月内的天数,这两种情况完全不同。
后一种情况涵盖了60不能被n
整除的情况,并且通过简单的数学运算,您很快就会发现需要一个起点。
n
分钟(60可被n
整除)为此,我们使用定义范围和步长值的组合:
man 5 crontab
:步骤值可与范围结合使用。在/<number>
的范围之后指定了跳过 数字在整个范围内的值。例如,可以使用0-23/2
在&#39;小时&#39;字段,指定每隔一小时执行一次命令 (V7标准中的替代方案是0,2,4,6,8,10,12,14,16,18,20,22
)。步数值也是允许的 在星号之后,如果指定要每两小时运行一次的作业, 你可以使用*/2
。
请参阅以下示例:
# Example of job definition:
# .----------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
m/n * * * * command1
此处,从{m>到第59分钟,每隔n分钟执行command1
。
这意味着:
m<=n
,它们将始终间隔n
分钟。
例如。 m=2,n=10
::作业将在几分钟2,12,22,32,42,52
m>n
,它们将始终间隔n
分钟,除非是{。}}分钟
一小时的开始。
例如。 m=12,n=10
::作业将在几分钟12,22,32,42,52
上运行。所以我们在52
和12th
分钟之间跳了20分钟。 注意:你清楚地看到,如果n
没有完美地划分60,你就会遇到问题。例如。 m=0,n=11
在0,11,22,33,44,55
上运行,因此我们只有5分钟到下一次运行。
n
YYYY-MM-DD HH:MM:00
分钟
这个案例是通用的,涵盖60的不可分割性。
这里变得更有趣,需要采用不同的方法。当您拥有特定日期的连续计数器时,可以解决此问题。输入UNIX时间戳,即1970-01-01 00:00:00 UTC
以来的总秒数。让我们说我们想要从McFly抵达Riverdale的那一刻开始:
% date -d '2015-10-21 07:28:00' +%s
1445412480
对于在2015-10-21 07:28:00&#39;之后每隔7
分钟运行一次cronjob,crontab将如下所示:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * * mintestcmd "2015-10-21 07:28:00" 7 && command2
将mintestcmd
定义为
#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes
delta=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( delta % modulo == 0))
备注: UNIX时间以UTC格式给出。如果您的cron运行在受夏令时影响的不同时区,建议不要在2到3点之间运行命令。这可能会跳过命令或运行命令两次(取决于时间是向前还是向后跳跃)
备注: UNIX时间不受闰秒的影响
备注: cron
没有亚秒级准确度
答案 2 :(得分:0)
您无法根据用户输入或触发器创建cron表达式。
更好的解决方案是使用布尔标志启用或禁用cron,即在用户启动触发器时启用cron服务方法,如下所示:
public static boolean cronEnabled = false;
public cronServiceMethod(){
if(cronEnabled){
// Keep your logic here
}
}
// Call this method when user clicks the Start button
public enableCron(){
cronEnabled = true;
}
public disableCron(){
cronEnabled = false;
}
就cron而言,让它每10分钟运行一次,如下所示:
0 0/10 * * * ?
答案 3 :(得分:0)