当从命令行 bash 运行时,无法从 crontab 运行 bash 脚本

当从命令行 bash 运行时,无法从 crontab 运行 bash 脚本

我遇到了一个奇怪的问题,即能够从命令行运行 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

由于之前出现的问题,的时间规范atnow+0min- 所以它在最后才再次运行。

该次运行失败,因此至少没有循环。

导致的问题now+0min是为n % 10,所以$RANDOM % 1= 0,且rmin= 0。

添加第二行

set -x

为了更好地记录脚本,您将在最后一行看到 0 时间规范。

相关内容