我在 Ubuntu 无头服务器 18.04 上使用 cron,但以下 cron 没有执行:
30 13 * * 6 test $((10#$(date +%W)%4)) -eq 1 && /bin/bash /backup/test.sh
我在 shell 中测试了该命令:
test $((10#$(date +%W)%4)) -eq 1 && /bin/bash /backup/test.sh
并且它运行良好,但如果它在 cron 中,它就不会执行它。
答案1
cron 中使用了“错误”的 shell
您的测试命令似乎使用了可能被除 之外的某些 shell“误解”的语法bash
。Cron默认情况下使用/bin/sh
shell。
可供选择的可能的修复方法:
A)将test
参数括在单引号中并强制使用“正确”的 shell
0 13 * * 6 /bin/bash -c 'test $((10#$(date +%W)%4)) -eq 0' && …
b)将你的测试命令移动到 shebang 中明确选择的 shell 的单独可执行文件中:
#!/bin/bash
exec test "$((10#$(date +%W)%4))" -eq 1
C)更改使用的 shell cron
。在 crontab 中添加行
SHELL=/bin/bash
在您特定的案例中,选项“a”似乎是最好的,但类似的问题可能最好由其他选项解决。
答案2
我不知道这是否可行:
30 13 * * 6/4 /bin/bash /backup/test.sh
我不确定它是否能按预期运行,但如果我的理解man 5 crontab
正确的话,它会每四个星期六运行一次(但可能不是您的代码指定的确切日期)。
还请注意,您需要在 crontabs 中转义百分号,并且它们不能通过像十进制这样的 bashism 10#
(除非您SHELL=/bin/bash
在 crontab 顶部使用或您的/bin/sh
是指向 的符号链接/bin/bash
)。
也许可以尝试这个:
30 13 * * 6 test $((1$(date +%%W)%%4)) -eq 1 && /bin/bash /backup/test.sh
这会去掉 bashism,并用一个连接替换它,否则会吸收前导零(107%4
== 7%4
==3
因为 100 可以被 4 整除)。它还会转义百分号,因此 crontab 不会尝试解释它们。