调度器的Cron表达式

3

我需要创建一个调度程序,它需要在每周的两天(星期四和星期五)从第一天早上9点开始运行,持续2天直到第二天晚上11点59分。为此,我需要提供一个cron表达式。

0-0 0-0 9-23 ? * THU,FRI *

我不知道如何创建在两天之间每隔39小时运行的定时任务。它需要在每周的星期四上午9点到星期五晚上11点59分之间每秒钟运行一次。


你介意创建两个单独的cron作业吗?一个用于每天。 - Tom Slabbaert
有时候我们会以复杂的方式思考问题,而实际上可能存在非常简单的解决方案。@tomslabbaert 做得好! - Tarun Lalwani
你的意图是让cron在指定时间之间每秒运行作业吗?如果是这样,我认为这是不可能的,因为正如在man -s5 crontab中所述,“cron(8)每分钟检查一次cron条目”。 - David Yockey
3个回答

0

我认为你的需求并不存在一个有效的单个cron语法。 此外,正如其他用户在Cron中已经指出的那样,您不能低于1分钟的频率。

话虽如此,您可以在脚本代码中放置“sleep 1,2,3(...)”来创建偏移量(有点疯狂)。这样,即使每分钟执行一次,只有一个脚本真正被执行,而其他脚本则在等待它们准确的秒数启动。 我永远不会这样做,但作为最后的手段......


0

有几种方法可以黑掉它。但是你不能保证你会得到完美的执行结果。这个想法是编写一个脚本,每秒钟执行一次命令,持续1分钟。我们选择一分钟,因为这是cron能处理的最小分辨率。因此,如果你的系统停机,cron将在第一次机会时重新启动程序。

脚本:cron_per_second

#!/usr/bin/env bash
for i in {0..59}; do
    "$@" &
    sleep 1
done
wait

这会使用相应参数执行命令60次。每个命令都在后台执行,以避免由于命令的执行时间而产生的延迟。我们在执行下一个命令之前休眠1秒。您可以通过执行以下操作查看它的工作原理:
$ ./cron_per_second date -Ins

定时任务:

# 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
  * 9-23 *  *  4   /path/to/cron_per_second command arg1 arg2 arg3
  * *    *  *  5   /path/to/cron_per_second command arg1 arg2 arg3

第一项任务在每周四的晚上9点到12点之间每分钟运行一次。第二项任务在每周五每分钟运行一次。

警告:并不是说在两个连续的cronjob之间没有重叠。如果你的crontab很大,可能会出现一个任务在xx:yy:01执行,而下一个任务在xx:yy+1:00执行。因此,子秒级别的cronjob可能会从两个cronjobs中都运行xx:yy+1:00。


0

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