我有一个务运行每一小时.用户运行具有环境variabless在 .bash_profile 这项工作时的用户运行工作中从终端,但是,显然这些没有得到拾务时运行。

我已经试过了他们在 .profile.bashrc 但他们仍然似乎并没有得到回升。任何人都不会知道我在哪里可以把环境变量,务可以选择呢?

有帮助吗?

解决方案

有“的cron”运行一个外壳脚本,运行该命令之前设置环境。

始终

#   @(#)$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

在〜/斌/克龙这些脚本到一个脚本,“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 ${@:+"$@"}

(书面使用的是旧编码标准 - 今天,我会使用一个家当“!#”处开始)

在“〜/ .cronfile”是对我为由cron使用简档的变化 - 严格非交互和无呼应用于嘈杂着想。您能安排执行的.profile等来代替。 (该REAL_HOME东西是我的环境的一种假象 - 你可以假装它是一样的$ HOME)

因此,该代码读取相应的环境,然后从我的主目录执行命令的非克龙版本。因此,例如,我的“平日”命令如下:

:       "@(#)$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 从命令行。

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 它允许这些被宣布务文件(还GNU mcron).

ArchlinuxRedHat 使用 cronie不不 允许环境变量宣布,将扔中的语法错误的cron。日志。解决办法可能完成每项:

# 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的完整路径来替换它。

设置在/etc/environment瓦尔也在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中的源之后的任何命令将有你的环境,如果你登录。

如果您启动通过的cron与执行脚本:

#!/bin/bash -l

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

有关我本人不得不设置环境变量的PHP应用。我通过添加以下代码到我的crontab resloved它。

$ 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
...

相反

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

使用的bash -l -c

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

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

  

-a被修改或创建出口标记变量。

     

使用+而不是 - 导致这些标志被关闭

因此,在set -set +之间的一切都被出口到env后可用其他脚本等不使用set变量获得来源,但住在set只。

除此之外它也是有用的传递变量,当一个程序需要非root帐户来运行,但你需要的是其他用户的环境里面的一些变量。下面传入nullmailer示例瓦尔到电子邮件标题格式:

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

我想大多数提供的解决方案的,但没有在第一次担任。事实证明,虽然,这并不是说没有工作的解决方案。显然,我的~/.bashrc文件开始与下面的代码块:

case $- in
    *i*) ;;
    *) return;;
esac

这基本上是检查当前组在当前shell选项以确定该壳在交互的运行一个case statement。 如果外壳恰好是交互的运行,然后将其转移到采购的~/.bashrc文件。 然而,在通过cron调用的外壳,可变$-不包含i值指示交互性。 因此,~/.bashrc文件从来没有得到充分来源。其结果是,环境变量从来没有得到设置。 如果发生这种情况是你的问题,可随时注释掉的代码块如下,然后再试一次:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

我希望这证明有用

我用我的MacBook Oh-my-zsh所以我尝试了很多事情,才能在crontab任务运行,但最后,我溶液前面加上运行命令之前.zshrc

*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js

此任务运行,每30分钟,并且使用简档.zshrc执行我的节点命令。

不要忘了$HOME VAR前使用圆点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top