我在哪里可以设置crontab将使用的环境变量?

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

我已经尝试在.profile.bashrc设置它们,但是它们似乎仍然没有被拾取。 有谁知道我可以把环境变量的crontab可以拿起?

在运行命令之前,'cron'运行一个设置环境的shell脚本。

总是。

 # @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $ # Crontab file for Home Directory for Jonathan Leffler (JL) #----------------------------------------------------------------------------- #Min Hour Day Month Weekday Command #----------------------------------------------------------------------------- 0 * * * * /usr/bin/ksh /work1/jleffler/bin/Cron/hourly 1 1 * * * /usr/bin/ksh /work1/jleffler/bin/Cron/daily 23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday 2 3 * * 0 /usr/bin/ksh /work1/jleffler/bin/Cron/weekly 21 3 1 * * /usr/bin/ksh /work1/jleffler/bin/Cron/monthly 

〜/ bin / Cron中的脚本都链接到单个脚本“runcron”,它看起来像:

 : "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $" # # Commands to be performed by Cron (no debugging options) # Set environment -- not done by cron (usually switches HOME) . $HOME/.cronfile base=`basename $0` cmd=${REAL_HOME:-/real/home}/bin/$base if [ ! -x $cmd ] then cmd=${HOME}/bin/$base fi exec $cmd ${@:+"$@"} 

(使用较旧的编码标准书写 – 现在,我会在开始时使用一个shebang'#!')。

'〜/ .cronfile'是我的配置文件中的一个变种,供cron使用 – 严格地说是非交互式的,为了避免嘈杂而没有回应。 您可以安排执行.profile等等。 (REAL_HOME的东西是我的环境的人造物 – 你可以假装它和$ HOME一样。)

所以,这段代码读取适当的环境,然后从我的主目录执行非Cron版本的命令。 所以,例如,我的“周日”命令如下所示:

 : "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $" # # Commands to be done each weekday # Update ICSCOPE n.updics 

“每日”命令更简单:

 : "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $" # # Commands to be done daily # Nothing -- most things are done on weekdays only exit 0 

从命令行运行crontab -e时,您可以在crontab本身中定义环境变量。

 LANG=nb_NO.UTF-8 LC_ALL=nb_NO.UTF-8 # mh dom mon dow command * * * * * sleep 5s && echo "yo" 

该功能仅适用于cron的某些实现。 Ubuntu和Debian目前使用的是允许在crontab文件(也是GNU mcron )中声明的vixie -cron 。

Archlinux和RedHat使用cronie , 不允许声明环境变量,并会在cron.log中抛出语法错误。 可以按条目完成解决方法:

 # mh dom mon dow command * * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo" 

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

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

在这种情况下,它会选择您的$ HOME / .profile文件中定义的所有环境变量。

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

/etc/environment设置vars也适用于Ubuntu。 从12.04开始,/ etc / environment中的变量被加载到cron中。

在我看来比较容易的@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的源之后的任何命令都将具有您的环境,就像您登录一样。

对我来说,我不得不为PHP应用程序设置环境变量。 我通过将下面的代码添加到我的crontab来重新支持它。

 $ sudo crontab -e 

crontab中:

 ENVIRONMENT_VAR=production * * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php 

和doSomethingWonderful.php里面我可以得到的环境价值:

 <?php echo $_SERVER['ENVIRONMENT_VAR']; # => "production" 

我希望这有帮助!

无论你在crontab设置什么,都可以在cronjobs中直接使用,也可以使用脚本中的变量。

在cronjob的定义中使用它们

您可以配置crontab以便设置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 

并说脚本/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 ... 

在@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 

help set

– 标记为了导出而修改或创建的变量。

使用+而不是 – 使这些标志被关闭。

因此set -set +之间的所有内容都被导出到env ,然后可用于其他脚本等。不使用set变量可以获取源代码,而只能set

除此之外,当一个程序需要非root用户帐户运行时传递变量也很有用,但是在其他用户的环境中需要一些变量。 下面是一个传递nullmailer vars格式化电子邮件头的例子:

 su -s /bin/bash -c "set -a; \ . /path/to/nullmailer-vars; \ set +a; \ /usr/sbin/logcheck" logcheck 

cron的开发者,如果注意的话,应该修复这个糟糕的设计。 在cron下运行的程序应该和从命令行运行时一样运行。

这是Windows正确的地方。 当您通过Windows任务计划程序运行程序时,它使用Windows环境变量; 你不必进行英勇的调整来实现这一点。