我在哪里可以设置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环境变量; 你不必进行英勇的调整来实现这一点。