从cron作业运行bash脚本

时间:2019-03-09 00:43:08

标签: linux bash cron

我有以下脚本:

#!/bin/bash
echo "$(date +"%r")"

if [ "$FOLDER_ID" != "0" ]
then
  node /sync.js -d $FOLDER_ID -l /Downloads
fi

我正在使用docker容器,启动容器时已传递env变量FOLDER_ID。在启动Docker容器时,应通过将其传递为ENV来设置此变量。

当我运行此脚本时,node命令将按预期运行,但是当cron作业运行脚本时,它将在处打印日期,但不能正确执行node命令(我认为问题与$ FOLDER_ID有关变量)。

有什么建议吗? 谢谢

1 个答案:

答案 0 :(得分:0)

正如一些人在评论中FOLDER_ID所指出的那样,您需要将其设置在crontab行中吗?

您可以尝试调整crontab行以使用bash -x调用脚本,或者在脚本顶部附近放置set -x,这将导致bash在“ print命令及其参数中显示为他们被执行”。如果您收到来自cron的电子邮件,则您应该能够查看该电子邮件并找到类似以下内容的输出:

++ date +%r
+ echo '11:55:41 AM'
11:55:41 AM
+ '[' '' '!=' 0 ']'
+ node /sync.js -d -l /Downloads
...

请注意,以+开头的行显示了将作为命令执行的bash。

同样值得在bash脚本中添加一些标志来提高严格性,例如:

#!/bin/bash
set -euo pipefail

在这种情况下,-u标志将导致类似line 5: FOLDER_ID: unbound variable的情况,并且假设FOLDER_ID的设置不正确,则退出状态为非零,这有助于突出问题。

Ps值得在自己的行上使用set而不是在哈希爆炸(#!/bin/bash -euo pipefail)上使用,因为将其分开可以确保使用bash -x进行调试不会意外关闭预期的标志。