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

Jam*_*mes 250 unix linux crontab environment-variables

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

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

car*_*tad 236

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

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"
Run Code Online (Sandbox Code Playgroud)

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

ArchlinuxRedHat使用cronie,不允许声明环境变量,并会在cron.log中引发语法错误.解决方法可以按条目完成:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您不能像在shell中那样使用变量替换,因此像PATH =/usr/local/bin:$ PATH这样的声明将按字面解释. (54认同)
  • 我能够在RedHat 4.4.7-3和cronie-1.4.4-15.el6.x86_64下的crontab中设置环境变量 (7认同)
  • 如果变量仅在命令中使用,则实际上不需要导出变量,只需在命令之前添加它们."*****睡5s; LC_ALL = nb_NO.UTF-8 echo $ LC_ALL" (5认同)
  • [cronie 现在确实会从 crontab 复制除少数环境变量之外的所有环境变量](https://github.com/cronie-crond/cronie/blob/master/src/security.c#L648),正如@bruno所说。 (4认同)

Vis*_*hal 135

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

0 5 * * * . $HOME/.profile; /path/to/command/to/run
Run Code Online (Sandbox Code Playgroud)

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

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

  • 该期限相当于"来源"命令:http://tldp.org/LDP/abs/html/special-chars.html#DOTREF (8认同)
  • 直到我意识到我在$ HOME之前省略了那段时间,这才对我有用.那段时间究竟是什么呢? (5认同)
  • @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认同)

Jon*_*ler 84

让'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
Run Code Online (Sandbox Code Playgroud)

〜/ 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 ${@:+"$@"}
Run Code Online (Sandbox Code Playgroud)

(使用较旧的编码标准编写 - 如今,我在开始时使用了一个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
Run Code Online (Sandbox Code Playgroud)

'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
Run Code Online (Sandbox Code Playgroud)


bax*_*ico 51

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

  • @Savageman就像用聚变炸弹杀死苍蝇一样,意外行为的赌注也非常高. (12认同)
  • 最好的答案,只需执行`env >>/etc/environment`,所有当前的env变量现在都可以在CRON作业中使用. (10认同)
  • 这对我很有用.特别是因为我遇到了Docker容器,所以我并不关心"系统范围"的含义. (5认同)
  • 请小心:如果环境变量之一中有哈希符号,`env >> /etc/environment` 将失败。我在对应用程序进行故障排除时经历了最困难的时期。结果是一个包含“#”的密码,该密码在该步骤中被截断。 (5认同)
  • 这应该是选择的答案。我不知道为什么人们会用其他答案或关于 env >> /etc/environment 的东西使事情变得复杂。如果您希望这些环境变量普遍可用,只需眨眼即可编辑 etc/environment :我的实验似乎证实 /etc/environment 中环境变量的导出语句可供 crontab 和用户使用。问题:再次从我的实验中得出:这些环境变量似乎没有在 crontab 本身内扩展!...即它们仅在调用的脚本中扩展! (3认同)
  • 在我的测试中,“/etc/environment”中的变量在 cron 中不可用。是否有一些设置可以决定这一点? (2认同)

bre*_*hmg 24

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

#!/bin/bash -l
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案应该得到更多的认可,并且应该只是被选择的答案:非常简单而优雅,避免了无数次需要在系统中跳转的麻烦。 (2认同)
  • 来自 man 的解释: -l 使 bash 的行为就像它已作为登录 shell 被调用一样(请参阅下面的 INVOCATION)。 (2认同)
  • @PeterKrauss无论您希望完成什么,**`chmod 777`都是*错误*和*危险的。***您将希望尽快恢复到理智的权限(对于您的用例,可能是`chmod 755`)并且如果您在面向公众的系统上拥有世界可写的系统文件,至少调查它是否可能被破坏并用作闯入组织网络的枢纽点。 (2认同)

Rob*_*ita 22

扩展@carestad示例(我发现更容易)是使用cron运行脚本并在脚本中使用环境.

在crontab -e文件中:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh
Run Code Online (Sandbox Code Playgroud)

在cron_job.sh文件中:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
Run Code Online (Sandbox Code Playgroud)

在.bash_profile源之后的任何命令都会像您登录一样拥有您的环境.

  • crontab 不是脚本文件,而是具有自己格式的程序。为了使事情与可能的命令保持一致,所有 shell 从开始到结束都是相同的。请参阅:https://www.man7.org/linux/man-pages/man5/crontab.5.html 并搜索“SHELL” (3认同)

kar*_*gen 15

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

$ sudo  crontab -e
Run Code Online (Sandbox Code Playgroud)

crontab中:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
Run Code Online (Sandbox Code Playgroud)

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

<?php     
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!


fed*_*qui 10

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

在cronjob的定义中使用它们

您可以进行配置,crontab以便设置可以使用cronjob的变量:

$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello
Run Code Online (Sandbox Code Playgroud)

现在该文件/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
Run Code Online (Sandbox Code Playgroud)

在cronjob运行的脚本中使用它们

您可以进行配置,crontab以便设置脚本可以使用的变量:

$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh
Run Code Online (Sandbox Code Playgroud)

并说脚本/tmp/myscript.sh是这样的:

echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res
Run Code Online (Sandbox Code Playgroud)

它生成一个文件/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
...
Run Code Online (Sandbox Code Playgroud)


小智 8

Oh-my-zsh在我的 macbook 中使用,所以我尝试了很多方法来运行 crontab 任务,但最后,我的解决方案是.zshrc在要运行的命令之前添加 。

*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js
Run Code Online (Sandbox Code Playgroud)

该任务每 30 分钟运行一次,并使用.zshrc配置文件来执行我的节点命令。

不要忘记在 var 之前使用点$HOME


小智 7

Expanding on @Robert Brisita 刚刚 expand ,同样如果您不想在脚本中设置配置文件的所有变量,您可以在脚本顶部选择要导出的变量

在 crontab -e 文件中:

SHELL=/bin/bash

*/1 * * * * /Path/to/script/script.sh
Run Code Online (Sandbox Code Playgroud)

在脚本.sh

#!/bin/bash
export JAVA_HOME=/path/to/jdk

some-other-command
Run Code Online (Sandbox Code Playgroud)


Ily*_*mov 6

代替

0  *  *  *  *  sh /my/script.sh
Run Code Online (Sandbox Code Playgroud)

使用bash -l -c

0  *  *  *  *  bash -l -c 'sh /my/script.sh'
Run Code Online (Sandbox Code Playgroud)

  • 如果我需要运行 perl/python/ruby 脚本而不是 bash 怎么办?我无法将 #!/bin/bash -l 添加到 python 脚本的顶部。 (5认同)

Hus*_*sam 6

您还可以在命令前添加env注入环境变量,如下所示:

0 * * * *   env VARIABLE=VALUE /usr/bin/mycommand
Run Code Online (Sandbox Code Playgroud)