Cron不接受bash语法

时间:2018-07-08 16:47:34

标签: bash cron

我有一个与crontab一起运行的bashscript。不幸的是,手动运行时可以正常运行的脚本失败,并显示以下错误:

Syntax error: "(" unexpected (expecting "}")

有问题的行是第22行,即:

declare -a PREV_TOTAL=( $(for i in ${range[@]}; do echo 0; done) )

在较大的上下文中:

TOTAL_CPU_USAGE=0
    TOTAL_CPU=$(grep -c ^processor /proc/cpuinfo) #set number of CPUs to check for
    declare -a 'range=({'"0..$TOTAL_CPU"'})'
    let "TOTAL_CPU=$TOTAL_CPU - 1"

    #declare array of size TOTAL_CPU to store values (eg. 8 cpus makes arrays of size 8)
    declare -a PREV_TOTAL=( $(for i in ${range[@]}; do echo 0; done) )
    declare -a PREV_IDLE=( $(for i in ${range[@]}; do echo 0; done) )

这在手动情况下可以正常工作,但是我不明白我在做错什么导致cron给出此错误?如果您知道,我将不胜感激。谢谢。

编辑:我的crontab如下:

# m h  dom mon dow   command
SHELL=/bin/bash
@reboot cd /home/ubuntu/waste-cloud-computing/probe && probe.sh >> /var/log/somelogfile.log 2>&1

然后我用sudo crontab -e访问它。提供SHELL变量时,我仍然遇到问题。

编辑1:由于有了一些帮助,我通过确保外壳程序使用bash克服了语法问题。现在我得到了错误/bin/bash: probe.bash: command not found。我假设它存在某种PATH问题,但是which bash返回/bin/bash,所以对我来说似乎很正常。也许有人知道怎么回事?

2 个答案:

答案 0 :(得分:3)

cron作业默认情况下由sh运行,而不是bash运行。如果您使用的是ubuntu / vixiecron,则可以在crontab的顶部设置SHELL env变量,以使cron使用bash运行crontab中的命令。

SHELL=/bin/bash

如果要运行的脚本是bash脚本,请确保第一行有一个Shebang:

#!/bin/bash

还请注意,如果您的脚本依赖于特定用户的配置文件,env vars等(取决于您正在编辑的crontab),则还有其他潜在的故障排除步骤。

答案 1 :(得分:1)

由于这里人们的帮助,我发现我的问题不是语法,而是使用sh over bash。通过以这种方式设置crontab可以解决此问题,以便将来的用户可以看到:

# m h  dom mon dow   command
SHELL=/bin/bash
@reboot cd /home/ubuntu/waste-cloud-computing/probe && ./probe.sh >> /var/log/somelogfile.log 2>&1

关键点是要设置的SHELL变量以及运行脚本之前的./。