我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
当前回答
对于我来说,我必须为php应用程序设置环境变量。我通过向crontab添加以下代码来解决这个问题。
$ sudo crontab -e
定时任务:
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
在doSomethingWonderful.php我可以得到的环境值:
<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
我希望这能有所帮助!
其他回答
让'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
我在查看与标题匹配的类似问题时发现了这个问题,但我被systemd或docker使用的环境文件语法困住了:
FOO=bar
BAZ=qux
这并不适用于Vishal的优秀答案,因为它们不是bash脚本(注意缺少导出)。 我使用的解决方案是将每一行读入xargs并在运行命令之前导出它们:
0 5 * * * export $(xargs < $HOME/.env); /path/to/command/to/run
从命令行运行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"
在@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源文件后面的任何命令都将拥有您的环境,就像您登录了一样。
展开@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