我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
当前回答
如果你通过cron开始执行脚本:
#!/bin/bash -l
他们应该捡起你的~/。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,产生无意义的语法错误
展开@Robert Brisita刚刚展开,如果你不想在脚本中设置配置文件的所有变量,你可以在脚本顶部选择要导出的变量
在crontab -e文件中:
SHELL=/bin/bash
*/1 * * * * /Path/to/script/script.sh
在script.sh
#!/bin/bash
export JAVA_HOME=/path/to/jdk
some-other-command
另一种方式-受此启发-“注入”变量如下(fcron的例子):
%daily 00 12 \
set -a; \
. /path/to/file/containing/vars; \
set +a; \
/path/to/script/using/vars
从帮助集:
-a标记已修改或创建用于导出的变量。 使用+而不是-会导致这些标志被关闭。
因此,set -和set +之间的所有内容都被导出到env中,然后可用于其他脚本,等等。如果不使用set,变量将只存在于set中。
除此之外,当程序需要一个非根帐户来运行,但你需要在其他用户的环境中使用一些变量时,传递变量也很有用。下面是一个传入nullmailer vars来格式化电子邮件头的例子:
su -s /bin/bash -c "set -a; \
. /path/to/nullmailer-vars; \
set +a; \
/usr/sbin/logcheck" logcheck
在/etc/environment中设置变量在Ubuntu中也适用。从12.04开始,/etc/environment中的变量将为cron加载。
在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
...