我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
当前回答
我尝试了大部分提供的解决方案,但一开始都没用。然而,事实证明,并不是解决方案失败了。显然,我的~/。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
我希望这对你有用
其他回答
在crontab中设置的任何内容都可以在cronjob中使用,可以直接使用,也可以使用脚本中的变量。
在cronjob的定义中使用它们
你可以配置crontab,让它设置can cronjob使用的变量:
$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello
现在/tmp/hello文件显示如下内容:
$ cat /tmp/hello
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016
在cronjob运行的脚本中使用它们
您可以配置crontab,以便它设置脚本可以使用的变量:
$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh
然后输入script /tmp/myscript.sh如下所示:
echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res
它生成一个文件/tmp/myoutput。res展示:
$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...
在@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源文件后面的任何命令都将拥有您的环境,就像您登录了一样。
对我有用的(基于debian):
创建一个包含所有需要的env变量的文件: # !/bin/bash env | grep VAR1= > /etc/environment . env | grep VAR1= > /etc/environment . env | /etc/environment . env | grep VAR2= >> /etc/environment . env | grep VAR3= >> 然后,通过在调用需要它的脚本之前调用env文件来构建crontab内容,从而启动cron服务 (crontab -l;Echo '* * * * *。/etc/environment;/usr/local/bin/python /mycode.py >> /var/log/cron-1.log 2>&1') | crontab 服务cron启动
注意:对于python用例,一定要调用整个python路径,否则可能会调用错误的python,产生无意义的语法错误
你也可以在命令前加上env注入环境变量,如下所示:
0 * * * * env VARIABLE=VALUE /usr/bin/mycommand
对于这个问题,我还有一个解决方案:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
在这种情况下,它将选择$HOME/中定义的所有环境变量。概要文件。
当然$HOME也没有设置,你必须用$HOME的完整路径替换它。