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

时间:2014-10-23 15:01:06

标签: bash cron crontab

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

搜索了问题之后,似乎标准shell没有像bash这样的数学运算符,比如%(模数)。我不确定为什么cron作业在脚本中失败了?我假设这是因为它没有使用bash shell?它肯定是被cron守护进程触发的(可以在/ var / log / syslog中看到它)。任何帮助非常感谢。

3 个答案:

答案 0 :(得分:14)

您可能需要告诉cron要使用的shell是bash shell,因为它默认为sh。您可以通过将此行放在crontab中来为所有crontab条目执行此操作:

SHELL=/bin/bash

请注意,这将导致crontab中的所有脚本都在bash下运行,这可能不是您想要的。如果要将crontab行本身更改为仅运行bash,请将其更改为:

* * * * 1-5 root /bin/bash /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log 2>&1

请注意,我还将stderr写入cron.log文件(2>& 1),这可能不是您想要的,但这是很常见的做法。这可以帮助您进一步诊断脚本中的错误。

答案 1 :(得分:1)

如果这有助于任何人:对我而言,这似乎是因为我最终得到了“DOS”line endings(CR-LF)而不是“unix”行结尾(LF)。这可以使用od或您最喜欢的十六进制转储工具进行检查,例如:

od -c <script_file>

...并寻找\ r \ n而不只是\ n。

似乎(和this article支持它)CR字符阻止“shebang”工作,因为它被解释为shell可执行文件的一部分。

(行结尾本身出现是因为该文件来自git存储库并通过Windows机器传输。)

答案 2 :(得分:0)

在尝试以root身份计划数据库备份时,我也遇到了这个问题,这让我发疯了!我正在使用CentOS 7盒。 每当我检查/var/spool/mail/root时,我都会看到一条日志: sh: root: command not found,但该命令将在终端中完美运行。

这对我有用:

  1. 以root用户身份登录时,我使用crontab -e创建了crontab条目。

  2. 以上面的命令为例:

    * * * * 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

我删除了root用户条目,例如: * * * * 1-5 /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log

那解决了我的问题。