我遇到了一个奇怪的问题,即能够从命令行运行 bash 脚本,但不能从 root 的 crontab 条目运行。我正在运行 Ubuntu 12.04。
* * * * 1-5 root /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log
如果我使用 bash 从 cmd 行运行脚本,它可以正常工作,但 sh 会失败并出现以下错误:
jmeter-cron-randomise.sh: 7: jmeter-cron-randomise.sh: arithmetic expression: expecting primary: " % 1 "
在谷歌上搜索了这个问题后,我发现 stand shell 似乎没有像 bash 那样的数学运算符,例如 %(模数)。不确定为什么 cron 作业在脚本中失败?我猜是因为它没有使用 bash shell?它肯定是由 cron 守护进程触发的(可以在 /var/log/syslog 中看到它)。非常感谢任何帮助。
导致问题的脚本
#!/bin/bash
echo Running the jmeter-cron-randomiser script
script="/home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron.sh"
min=$(( 1 * 1 ))
rmin=$(( $RANDOM % $min ))
echo "min = ${min}";
echo "rmin = ${rmin}"
at -f "$script" now+${rmin}min
答案1
我注意到crontab(5)手册页中,这个:
“第六个”字段(该行的其余部分)指定要运行的命令。该行的整个命令部分将由 /bin/sh 或者通过 cronfile 的 SHELL 变量中指定的 shell。
因此,您可能希望使用以下方式指定 bash
SHELL=/bin/bash
或者,由于上述操作会影响所有 cron 脚本,因此
* * * * 1-5 root bash /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log
# ...............^^^^
答案2
crontab做使用 运行脚本bash
;
但是您正在使用 递归运行它at
。
和at
用途/bin/sh
。
由于之前出现的问题,的时间规范at
是now+0min
- 所以它在最后才再次运行。
该次运行失败,因此至少没有循环。
导致的问题now+0min
是为n % 1
0,所以$RANDOM % 1
= 0,且rmin
= 0。
添加第二行
set -x
为了更好地记录脚本,您将在最后一行看到 0 时间规范。