Cron表达式从日期开始每天运行

时间:2016-01-22 07:56:38

标签: cron quartz-scheduler cronexpression

我需要一个cron表达式,从2016年1月25日开始每天下午12点开始。这就是我想出的:

0 0 12 25/1 * ? *

但是在31日之后,下一次开火时间是25日。

是否有用于执行此操作的cron表达式表达式?如果没有,我可以使用什么?

4 个答案:

答案 0 :(得分:2)

假设在1月25日之后你想要永远运行这个过程(即2032,可能服务器已经被替换),我会用三个表达式来做:

0 0 12 25-31 1 * 2016  command # Will run the last days of Jan 2016 after the 25th
0 0 12 * 2-12 * 2016   command # Will run the rest of the months of 2016
0 0 12 * * * 2017-2032 command # will run for every day of years 2017 and after.

我希望这会有所帮助。

答案 1 :(得分:0)

有多种方法可以完成此任务,一个可以运行带有cron作业和测试条件的脚本,如果是,则运行实际需要的脚本,否则跳过。

这是一个例子,

20 0 * * * home/hacks/myscript.sh

并在myscript.sh中将代码置于测试条件并运行实际命令/脚本

以下是此类脚本的示例

#!/bin/bash

if( ( $(date) <= "31-01-2016" ) || ( $(date) >= "25-02-2017" ) ){

   // execute your command/script
}else {
     // do Nothing
}

答案 2 :(得分:0)

您可以编写一个日期表达式,该表达式仅匹配特定时间点之后的日期;或者您可以为脚本创建一个包装器,如果当前日期早于主脚本应该运行的时间之前就会中止

#!/bin/bash
# This is GNU date, adapt as required for *BSD and other variants
[[ $(date +%s -d 2018-02-25\ 00:00:00) > $(date +%s) ]] && exit
exec /path/to/your/real/script "$@"

...或者您可以使用at安排添加此cron作业。

at -t 201802242300 <<\:
schedule='0 0 12 25/1 * ? *'   # update to add your command, obviously
crontab=$(crontab -l)
case $crontab in
    *"$schedule"*) ;;          # already there, do nothing
    *) printf "%s\n" "$crontab" "$schedule" | crontab - ;;
esac
:

(未经测试,但你明白了。我只是复制/粘贴你的时间表达式,我猜它对crontab并不是真的有用。我认为Quartz有办法做类似的事情。)

at的时间规格很奇怪,我设法让它在Mac上运行,但在Linux上可能会有所不同。请注意,我将其设置为前一天晚上23:00运行,即计划首次执行前一小时。

答案 3 :(得分:0)

这是我的回答here的简短副本。 最简单的方法是使用额外的脚本进行测试。你的cron看起来像:

# 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
  0  12  *  *  *  daytestcmd 1 20160125 && command1
  0  12 *  *  *   daytestcmd 2 20160125 && command2

此处,command1将从2016-01-25开始每天执行。 command2将在2016-01-25之后每隔一天执行一次。

daytestcmd定义为

#!/usr/bin/env bash
# get start time in seconds
start=$(date -d "${2:-@0}" '+%s')
# get current time in seconds
now=$(date '+%s')
# get the amount of days (86400 seconds per day)
days=$(( (now-start) /86400 ))
# set the modulo
modulo=$1
# do the test
(( days >= 0 )) && (( days % modulo == 0))