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)中声明它们.
Archlinux和RedHat使用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)
Vis*_*hal 135
我有另外一个解决这个问题的方法:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它将选择$ HOME/.profile文件中定义的所有环境变量.
当然$ HOME也没有设置,你必须用$ HOME的完整路径替换它.
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加载变量.
bre*_*hmg 24
如果您启动脚本,则通过cron执行:
#!/bin/bash -l
Run Code Online (Sandbox Code Playgroud)
他们应该拿起你的~/.bash_profile
环境变量
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源之后的任何命令都会像您登录一样拥有您的环境.
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中直接使用,也可以使用脚本中的变量.
您可以进行配置,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)
您可以进行配置,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)
代替
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)
您还可以在命令前添加env
注入环境变量,如下所示:
0 * * * * env VARIABLE=VALUE /usr/bin/mycommand
Run Code Online (Sandbox Code Playgroud)