我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。

我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?


当前回答

对于这个问题,我还有一个解决方案:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

在这种情况下,它将选择$HOME/中定义的所有环境变量。概要文件。

当然$HOME也没有设置,你必须用$HOME的完整路径替换它。

其他回答

我在查看与标题匹配的类似问题时发现了这个问题,但我被systemd或docker使用的环境文件语法困住了:

FOO=bar
BAZ=qux

这并不适用于Vishal的优秀答案,因为它们不是bash脚本(注意缺少导出)。 我使用的解决方案是将每一行读入xargs并在运行命令之前导出它们:

0 5 * * * export $(xargs < $HOME/.env); /path/to/command/to/run

我尝试了大部分提供的解决方案,但一开始都没用。然而,事实证明,并不是解决方案失败了。显然,我的~/。Bashrc文件以以下代码块开始:

case $- in
    *i*) ;;
    *) return;;
esac

This basically is a case statement that checks the current set of options in the current shell to determine that the shell is running interactively. If the shell happens to be running interactively, then it moves on to sourcing the ~/.bashrc file. However, in a shell invoked by cron, the $- variable doesn't contain the i value which indicates interactivity. Therefore, the ~/.bashrc file never gets sourced fully. As a result, the environment variables never got set. If this happens to be your issue, feel free to comment out the block of code as follows and try again:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

我希望这对你有用

我在我的macbook上使用哦-我的-zsh,所以我已经尝试了很多方法来让crontab任务运行,但最后,我的解决方案是在运行命令之前前置.zshrc。

*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js

该任务每30分钟运行一次,并使用.zshrc配置文件执行我的节点命令。

别忘了在$HOME变量前加上点。

对于这个问题,我还有一个解决方案:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

在这种情况下,它将选择$HOME/中定义的所有环境变量。概要文件。

当然$HOME也没有设置,你必须用$HOME的完整路径替换它。

以上所有解决方案都很有效。

当环境变量中有任何特殊字符时,就会产生问题。

我找到了解决方案:

eval $ (printenv | awk - f = '{打印“出口”“\”“1美元 "\"""=""\""$ 2 "\"" }' >> / 等/配置文件)