我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。
我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?
当前回答
全局设置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"
=)
其他回答
我在我的macbook上使用哦-我的-zsh,所以我已经尝试了很多方法来让crontab任务运行,但最后,我的解决方案是在运行命令之前前置.zshrc。
*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js
该任务每30分钟运行一次,并使用.zshrc配置文件执行我的节点命令。
别忘了在$HOME变量前加上点。
对于这个问题,我还有一个解决方案:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
在这种情况下,它将选择$HOME/中定义的所有环境变量。概要文件。
当然$HOME也没有设置,你必须用$HOME的完整路径替换它。
在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
...
在@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