Cron Job仅在一周中的某一天运行

Ami*_*gar 4 cron crontab cronexpression

0 0 2-31 * sun         /home/ubuntu/x.h
0 0 2-31 * mon-sat     /home/ubuntu/y.h
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ill 7

这是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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

所以,这应该适合你:

0 0 2-31 * 0         /home/ubuntu/x.h
0 0 2-31 * 1-6       /home/ubuntu/y.h
Run Code Online (Sandbox Code Playgroud)

我不确定为什么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
Run Code Online (Sandbox Code Playgroud)

$(date '+%u')返回1-7表示周一至周日.试试echo $(date '+%u')一个例子.