如何在 crontab 中正确使用环境变量

如何在 crontab 中正确使用环境变量

我在 ~/.bashrc 文件 (Ubuntu 20) 中导出了一个变量,我想在 cron 作业中使用它。在寻找答案时,我找到了两种方法,但都不适合我:

12 11 * * * BASH_ENV=/home/l86/.bashrc bash -l -c 'echo "USING TOKEN $GITTOKEN" >> /var/log/custom-cron.log 2>&1'

并且

12 11 * * * source /home/l86/.bashrc; echo "USING TOKEN $GITTOKEN" >> /var/log/custom-cron.log 2>&1

但是变量值仍然被打印为空,当我在 cron 之外执行相同命令(使用 shell)时情况并非如此。

答案1

您的 crontab 未在 BASH (/bin/bash) 中执行作业,很可能是在纯 SH (/bin/sh) 中执行,而纯 SH 应该指向 DASH。因此您需要按照以下方法操作SO 上的解决方案..但有几个没有明确提到的变化:主要的是.bashrc只运行如果 shell 是交互式的这是好事的原因)。您应该导出该变量,并且可能需要使用转义的 $ 符号引用它。因此,在您的源文件中:

export GITTOKEN="blah-123-secret-secret"

然后在你的 crontab 中执行

*/5 * * * * /bin/bash -c 'source /home/l86/.my-git-secret; echo "GIT: $GITTOKEN" >> /var/log/custom-cron.log 2>&1'

避免裁员的可能解决方案——如果你真的需要保守秘密仅有的在 .bashrc 中 - 你可以像这样重新捕获它(做不是该文件中多次出现字符串 GITTOKEN!):

*/5 * * * * /bin/bash -c 'export GITTOKEN="$(grep GITTOKEN /home/l86/.bashrc|cut -d= -f2)"; echo "GIT: $GITTOKEN" >> /var/log/custom-cron.log 2>&1'

要试验在运行 cronjob 时 ENV(-ironment) 是什么样子,您可以运行如下命令:

env -i sh -c '/bin/bash -c "source /home/l86/.not-the-bashrc; echo \"SOURCED: $GITTOKEN, ${GITTOKEN}, \$GITTOKEN\""'

答案2

您可以将/bin/bash外壳设置在里面crontab以解决难题:

(我假设您正在处理您的用户 crontab。)

$ crontab -e

在顶部添加此行:

SHELL=/bin/bash

至于命令,您现在可以在 bash 交互模式下运行脚本或命令(例如,对于您的情况 - 请注意开关-ici用于“交互式”,允许读取您的配置文件环境变量):

* * * * * bash -ic "(echo \"USING TOKEN $GITTOKEN\" >> /var/log/custom-cron.log 2>&1)"

使用 保存Ctrl+O。使用 退出Ctrl+X

如果您有一个使用用户环境变量的 bash 脚本,则 cron 行将变成如下所示(我的示例每 15 分钟运行一次):

*/15 9-15 * * 1-5 bash -ic "($HOME/.config/conky/scripts/stocks >> $HOME/.local/log/stocks.log 2>&1)" &

相关内容