我每小时都有一个crontab..bash_profile
当用户从终端运行作业时,运行它的用户在该工作中具有环境变量,但是,显然这些在运行时不被crontab拾取.
我试着在设置它们.profile
和.bashrc
,但他们似乎仍然没有得到回升.有谁知道我可以把crontab可以拿到的环境变量放在哪里?
crontab -e
从命令行运行时,可以在crontab中定义环境变量.
LANG=nb_NO.UTF-8 LC_ALL=nb_NO.UTF-8 # m h dom mon dow command * * * * * sleep 5s && echo "yo"
此功能仅适用于某些cron实现.Ubuntu和Debian目前使用vixie-cron,它允许在crontab文件(也是GNU mcron)中声明它们.
Archlinux和RedHat使用cronie,它不允许声明环境变量,并会在cron.log中引发语法错误.解决方法可以按条目完成:
# m h 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的完整路径替换它.
让'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版本.因此,例如,我的'weekday'命令如下所示:
: "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $" # # Commands to be done each weekday # Update ICSCOPE n.updics
'daily'命令更简单:
: "@(#)$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
设置vars /etc/environment
也在Ubuntu中为我工作.从12.04开始,/etc/environment
为cron加载变量.
如果您启动脚本,则通过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源之后的任何命令都会像您登录一样拥有您的环境.
对我来说,我必须为php应用程序设置环境变量.我通过将以下代码添加到我的crontab来重新获得它.
$ sudo crontab -e
crontab中:
ENVIRONMENT_VAR=production * * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
在doSomethingWonderful.php里面我可以通过以下方式获取环境值:
"production"
我希望这有帮助!
无论你设置什么,crontab
都可以在cronjobs中直接使用,也可以使用脚本中的变量.
您可以进行配置,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
您可以进行配置,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 ...
代替
0 * * * * sh /my/script.sh
使用bash -l -c
0 * * * * bash -l -c 'sh /my/script.sh'