我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
当前回答
而不是
0 * * * * sh /my/script.sh
使用bash -l -c
0 * * * * bash -l -c 'sh /my/script.sh'
其他回答
我尝试了大部分提供的解决方案,但一开始都没用。然而,事实证明,并不是解决方案失败了。显然,我的~/。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
我希望这对你有用
我在查看与标题匹配的类似问题时发现了这个问题,但我被systemd或docker使用的环境文件语法困住了:
FOO=bar
BAZ=qux
这并不适用于Vishal的优秀答案,因为它们不是bash脚本(注意缺少导出)。 我使用的解决方案是将每一行读入xargs并在运行命令之前导出它们:
0 5 * * * export $(xargs < $HOME/.env); /path/to/command/to/run
你也可以在命令前加上env注入环境变量,如下所示:
0 * * * * env VARIABLE=VALUE /usr/bin/mycommand
如果你通过cron开始执行脚本:
#!/bin/bash -l
他们应该捡起你的~/。Bash_profile环境变量
在@carestad示例的基础上展开(我觉得更简单),使用cron运行脚本,并将环境放在脚本中。
在crontab -e文件中:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
cron_job.sh文件:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
.bash_profile源文件后面的任何命令都将拥有您的环境,就像您登录了一样。