从本周六开始,Cronjob每两周(星期六)运行一次


11

今天是2014年10月3日,星期五,凌晨3:58

我想安排一个这样的cronjob在以下日期运行它:

  1. 2014年10月4日,星期六,上午8:00
  2. 2014年10月18日星期六,上午8:00
  3. 2014年11月1日(星期六)8:00 AM ...

因此,每2周一次,即星期六的8点。

Answers:


27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W:年的周数,星期一为一周的第一天,今天为第39周

10#$(date +%W)date +W将十进制数转换为十进制数,并避免shell基础解析混乱

$((39%2)):模运算:结果为0(偶数周数)或1(奇数周数),本周结果为1,下周为0

test 1 -eq 1:算术测试(相等),在这种情况下结果为布尔值true

&& yourCommand:布尔值AND:yourCommand仅在上一个命令的结果为布尔值true时运行

请注意,这一年可以得到两个奇数周:53(今年)和1(下一年)


2
太好了!正如您已经指出的那样,它仍然在每年的第53个星期六遇险,这将在每四个世纪中大约发生70年。
MadHatter 2014年

@Cyrus谢谢您的回答,但是如果我写* * * * 5测试$(($(date +%W)%2))-eq 1 && /u02/restore/scripts/test.sh,脚本不会运行,但如果我写* * * * 5 /u02/restore/scripts/test.sh脚本运行。为什么您的表情不起作用?我只是在测试这些案例,发现某种方式不起作用。
kupa 2014年

1
我的错。Cron将%解释为换行符。在您的cronjob中使用\逃逸两个百分比:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus

很抱歉带回这个旧问题,但是它对我没用,当我尝试执行$((10#$(date +%W)%2)) -eq 1 && echo OK我的shell 时,我试图执行周计算的结果:-bash: 1: command not found。任何线索为什么这样做?谢谢。
jhuet

3
@jhuet:test是用户,不是命令。试试:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus

4

您显示的是“每周”。然后代码是:

0 8 * * 6

您确定需要每两周运行一次吗?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand

1
你能解释一下命令,请
KUPA

1
最好使用Cyrus提供的内容-$((($(date +%W)%2))“ W”代表一年中的第几周。从零开始,到53。如果可以将其除以二,那么这就是您的“每秒”。所以的cronjob每周运行一次,但“expr的”执行命令yourCommand只有一周的数量可以除以2
Glueon

当我在命令行上运行测试$(($(date +%W)%2))-eq 1时什么也不返回,为什么?
kupa 2014年

1
只是运行echo $?在运行该命令后,看到它的返回码-这就是是很重要
啤酒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.