当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我在哪里可以设置crontab将使用的环境变量?》经验,为你挑选了9个好方法。

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

我试着在设置它们.profile.bashrc,但他们似乎仍然没有得到回升.有谁知道我可以把crontab可以拿到的环境变量放在哪里?



1> 小智..:

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"


请注意,您不能像在shell中那样使用变量替换,因此像PATH =/usr/local/bin:$ PATH这样的声明将按字面解释.
我能够在RedHat 4.4.7-3和cronie-1.4.4-15.el6.x86_64下的crontab中设置环境变量
如果变量仅在命令中使用,则实际上不需要导出变量,只需在命令之前添加它们."*****睡5s; LC_ALL = nb_NO.UTF-8 echo $ LC_ALL"

2> Vishal..:

我有另外一个解决这个问题的方法:

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

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

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


该期限相当于"来源"命令:http://tldp.org/LDP/abs/html/special-chars.html#DOTREF
直到我意识到我在$ HOME之前省略了那段时间,这才对我有用.那段时间究竟是什么呢?
@Vishal实际上,它现在适合我.我试图`source~/.bashrc`,结果发现我的`.bashrc`文件与cron作业有点冲突.如果我使用一个非常简单的`.env_setup_rc`文件只有一行:`export MY_ENV_VAR = my_env_val`,它实际上是有效的.请参阅我的帖子:http://stackoverflow.com/questions/15557777/crontab-job-does-not-get-the-environment-variables-set-in-bashrc-file

3> Jonathan Lef..:

让'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



4> baxeico..:

设置vars /etc/environment也在Ubuntu中为我工作.从12.04开始,/etc/environment为cron加载变量.


@Savageman就像用聚变炸弹杀死苍蝇一样,意外行为的赌注也非常高.
最好的答案,只需执行`env >>/etc/environment`,所有当前的env变量现在都可以在CRON作业中使用.
这对我很有用.特别是因为我遇到了Docker容器,所以我并不关心"系统范围"的含义.

5> 小智..:

如果您启动脚本,则通过cron执行:

#!/bin/bash -l

他们应该拿起你的~/.bash_profile环境变量


这个答案应该得到更多的认可,并且应该只是被选择的答案:非常简单而优雅,避免了无数次需要在系统中跳转的麻烦。

6> Robert Brisi..:

扩展@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源之后的任何命令都会像您登录一样拥有您的环境.



7> karlingen..:

对我来说,我必须为php应用程序设置环境变量.我通过将以下代码添加到我的crontab来重新获得它.

$ sudo  crontab -e

crontab中:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

在doSomethingWonderful.php里面我可以通过以下方式获取环境值:

 "production"

我希望这有帮助!



8> fedorqui..:

无论你设置什么,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
...



9> Ilya Kharlam..:

代替

0  *  *  *  *  sh /my/script.sh

使用bash -l -c

0  *  *  *  *  bash -l -c 'sh /my/script.sh'

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有