【问题标题】:Cron Job to run on a range of days only on a particular day of weekCron 作业仅在一周中的特定日期在几天范围内运行
【发布时间】:2021-04-27 15:50:46
【问题描述】:
0 0 2-31 * sun         /home/ubuntu/x.h
0 0 2-31 * mon-sat     /home/ubuntu/y.h

这最终会同时运行它们。我在这里做错了吗?

【问题讨论】:

  • 当然它最终会同时运行它们。我猜你的意思是在同一天。如果有,你有证据吗?
  • 2-31 天,如果是星期日 x.h 应该运行,非星期日 2-31 天 y.h 应该运行

标签: cron crontab cronexpression


【解决方案1】:

这是 crontab 格式:

* * * * *
| | | | |
| | | | +---- Day of the Week   (range: 0-6, 0 standing for Sunday)
| | | +------ Month of the Year (range: 1-12)
| | +-------- Day of the Month  (range: 1-31)
| +---------- Hour              (range: 0-23)
+------------ Minute            (range: 0-59)

Ubuntu man 5 crontab 说:

  field          allowed values
  -----          --------------
  minute         0-59
  hour           0-23
  day of month   1-31
  month          1-12 (or names, see below)
  day of week    0-7 (0 or 7 is Sun, or use names)

所以,这应该适合你:

0 0 2-31 * 0         /home/ubuntu/x.h
0 0 2-31 * 1-6       /home/ubuntu/y.h

我不确定为什么 7 会在星期六运行 - 您的系统时间是否准确且位于正确的时区?

编辑:啊,是的,很遗憾,您不能同时指定星期几和月份中的哪一天。来自man 5 crontab

注意:命令执行的日期可以由两个字段指定 - 月份的日期和星期几。如果两个字段都受到限制(即不是 *),则当任一字段与当前时间匹配时,将运行该命令。例如,“30 4 1,15 * 5”将导致命令在每个月的 1 日和 15 日以及每个星期五的凌晨 4:30 运行。但是,可以通过向命令添加测试来获得所需的结果(请参阅下面的示例 CRON 文件中的最后一个示例)。

所以,答案是:

0 0 2-31 * *       test $(date +\%u) -eq 7 && /home/ubuntu/x.h
0 0 2-31 * *       test $(date +\%u) -ne 7 && /home/ubuntu/y.h

$(date '+%u') 返回代表周一到周日的 1-7。以echo $(date '+%u') 为例。

【讨论】:

  • 这对我不起作用,我尝试了20 13 2-31 * 7 /home/ubuntu/x.h,但它也在今天运行,即星期六
  • 抱歉,已修复! Ubuntu 的格式不同。 0 是星期日。不知道为什么 7 周六跑了。
  • 还是不行!,这很奇怪,date of monthday of week 会叠加吗?我尝试运行13 58 * * 6,它运行良好,但添加日期范围会覆盖星期检查。我说的对吗?
  • 啊,哇,我学到了一些东西!请参阅我的编辑。我不知道crontab 的行为是这样的 :) 如果两个日期说明符都存在,则 either 必须匹配,而不是 both
  • 感谢您的帮助,该方法有效,但测试无效:(。虽然这有效test $(date +\%u) -eq 7您能否更改答案以便我接受?
【解决方案2】:
from datetime import datetime
from datetime import timedelta
import urllib.request

//urls to hit
urls=["https//:example1.com","https//:example2.com"
]

//function to hit url
def call(url):
 urllib.request.urlopen(url)

//function to get date 
def get_month_diff(current,nom):
    m1= current
    m2=m1 - timedelta(days=nom*30)
    m3=current
    m4=m2.replace(day=1)
    m5=m3.replace(day=1)-timedelta(days=1)
    list=str(m4).split(" ")[0].split("-")
    list.reverse()
    startDate="-".join(list)
    list1=str(m5).split(" ")[0].split("-")
    list1.reverse()
    endDate="-".join(list1)
    for i in range (0,5):
       call(urls[i]+""+startDate+"/"+endDate)
//main execution function
def solve():
    month=str(datetime.today()).split("-")[1]
    if month in ["01","04","07","10"] :get_month_diff(datetime.today(),3)
    if month in ["01","07"]:get_month_diff(datetime.today(),6)
    get_month_diff(datetime.today(),1)
solve()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2023-02-09
    • 2016-06-05
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多