我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。

我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?


当前回答

我在我的macbook上使用哦-我的-zsh,所以我已经尝试了很多方法来让crontab任务运行,但最后,我的解决方案是在运行命令之前前置.zshrc。

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

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

别忘了在$HOME变量前加上点。

其他回答

不幸的是,crontab的环境变量范围非常有限,因此每次运行corntab时都需要导出它们。

一个简单的方法是下面的例子,假设你的env变量在一个名为env的文件中,然后:

* * * * * ../env && /path/to_your/command

此部分. ./env将导出它们,然后在您的命令的相同范围内使用它们

全局设置env

sudo sh -c "echo MY_GLOBAL_ENV_TO_MY_CURRENT_DIR=$(pwd)" >> /etc/environment"

添加计划作业以启动脚本

crontab -e

  */5 * * * * sh -c "$MY_GLOBAL_ENV_TO_MY_CURRENT_DIR/start.sh"

=)

在crontab中设置的任何内容都可以在cronjob中使用,可以直接使用,也可以使用脚本中的变量。

在cronjob的定义中使用它们

你可以配置crontab,让它设置can 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

然后输入script /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
...

对于我来说,我必须为php应用程序设置环境变量。我通过向crontab添加以下代码来解决这个问题。

$ sudo  crontab -e

定时任务:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

在doSomethingWonderful.php我可以得到的环境值:

<?php     
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"

我希望这能有所帮助!

我在我的macbook上使用哦-我的-zsh,所以我已经尝试了很多方法来让crontab任务运行,但最后,我的解决方案是在运行命令之前前置.zshrc。

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

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

别忘了在$HOME变量前加上点。