beard black Asked: 2020-03-08 04:45:42 +0800 CST2020-03-08 04:45:42 +0800 CST 2020-03-08 04:45:42 +0800 CST cronjob 每 4 周一次,不执行 772 我在我的 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 中,它不会执行它。 linux ubuntu bash cron shell 2 个回答 Voted Best Answer AnFi 2020-03-08T07:25:01+08:002020-03-08T07:25:01+08:00 cron 中使用的“错误”shell 您的测试似乎命令使用的语法可能会被除bash. Cron默认使用/bin/shshell。 可供选择的可能修复: a)将test参数用单引号括起来并强制“正确”外壳 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)更改使用的外壳cron。在 crontab 添加行 SHELL=/bin/bash 在您的情况下,特定情况选项“a”似乎是最好的,但其他选项可能最好地解决类似的问题。 Adam Katz 2020-03-11T08:14:44+08:002020-03-11T08:14:44+08:00 我想知道这是否可行: 30 13 * * 6/4 /bin/bash /backup/test.sh 我不确定它是否会按要求运行,但如果我的理解man 5 crontab是正确的,它将每第四个星期六运行一次(但可能不是您的代码指定的确切日期)。 另请注意,您需要在 crontab 中转义百分号,并且它们不能像 base 10 via 那样执行 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 不会尝试解释它们。
cron 中使用的“错误”shell
您的测试似乎命令使用的语法可能会被除
bash
. Cron默认使用/bin/sh
shell。可供选择的可能修复:
a)将
test
参数用单引号括起来并强制“正确”外壳b)将您的测试命令移动到在shebang中使用明确选择的shell分隔的可执行文件:
c)更改使用的外壳
cron
。在 crontab 添加行在您的情况下,特定情况选项“a”似乎是最好的,但其他选项可能最好地解决类似的问题。
我想知道这是否可行:
我不确定它是否会按要求运行,但如果我的理解
man 5 crontab
是正确的,它将每第四个星期六运行一次(但可能不是您的代码指定的确切日期)。另请注意,您需要在 crontab 中转义百分号,并且它们不能像 base 10 via 那样执行 bashism
10#
(除非您SHELL=/bin/bash
在 crontab 顶部使用或者您/bin/sh
是指向 的符号链接/bin/bash
)。也许试试这个:
这取出了 bashism 并将其替换为连接,否则会吸收前导零(
107%4
==7%4
==3
因为 100 可以被 4 整除)。它还转义了百分号,因此 crontab 不会尝试解释它们。