我在哪里可以设置环境变量,务将使用?
-
19-09-2019 - |
题
我有一个务运行每一小时.用户运行具有环境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).
Archlinux 和 RedHat 使用 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前使用圆点。