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

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


当前回答

我在查看与标题匹配的类似问题时发现了这个问题,但我被systemd或docker使用的环境文件语法困住了:

FOO=bar
BAZ=qux

这并不适用于Vishal的优秀答案,因为它们不是bash脚本(注意缺少导出)。 我使用的解决方案是将每一行读入xargs并在运行命令之前导出它们:

0 5 * * * export $(xargs < $HOME/.env); /path/to/command/to/run

其他回答

展开@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

在@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源文件后面的任何命令都将拥有您的环境,就像您登录了一样。

我尝试了大部分提供的解决方案,但一开始都没用。然而,事实证明,并不是解决方案失败了。显然,我的~/。Bashrc文件以以下代码块开始:

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

This basically is a case statement that checks the current set of options in the current shell to determine that the shell is running interactively. If the shell happens to be running interactively, then it moves on to sourcing the ~/.bashrc file. However, in a shell invoked by cron, the $- variable doesn't contain the i value which indicates interactivity. Therefore, the ~/.bashrc file never gets sourced fully. As a result, the environment variables never got set. If this happens to be your issue, feel free to comment out the block of code as follows and try again:

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

我希望这对你有用

对我来说,我必须在NodeJS文件中指定路径。

// did not work!!!!!
require('dotenv').config()

而不是

// DID WORK!!
require('dotenv').config({ path: '/full/custom/path/to/your/.env' })

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