cron 中使用了“错误”的 shell

cron 中使用了“错误”的 shell

我在 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/shshell。

可供选择的可能的修复方法:

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 不会尝试解释它们。

相关内容