ubuntu – 在cronjob中加载用户环境变量

前端之家收集整理的这篇文章主要介绍了ubuntu – 在cronjob中加载用户环境变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在cronjob中加载用户环境变量?

我有一个cronjob应该在我的Ubuntu机器上每分钟启动一个脚本:

* * * * * /home/user/myscript.sh;

在这个脚本中,我想使用像$JAVA_HOME和$M2_HOME这样的环境变量来自动启动构建过程.问题是这些变量是通过导出JAVA_HOME = / .. / …在.bashrc中设置的.

因此,我在执行脚本之前获取这些文件

* * * * * source ~/.bash_profile; source ~/.bashrc; /home/user/myscript.sh;

但是,变量没有设置!为了测试这个,我通过env将环境变量回显到日志文件

env >> ~/env.log
echo $M2_HOME >> ~/env.log

日志文件仍然不包含变量.只有以下内容附加到文件(没有$M2_HOME等):

LANGUAGE=en_US:en
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/user

如果我在shell中运行脚本,则所有变量都打印到env.log.

当我将源命令放入脚本文件时也会发生同样的情况.只有在声明变量之前删除了export关键字,它才能被echo $var命令看到.但这不是解决方案,因为我不管理这些声明.

我尝试了有限的sh shell问题@tripplee的解决方案,但它仍然无法正常工作.我进一步将它简化为一个非常简单的cronjob而没有第二个脚本来显示问题:

* * * * * . $HOME/.bash_profile; . $HOME/.bashrc; env > $HOME/env.log;

cat /home/user/env.log:

LANGUAGE=en_US:en
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/user
cron作业语法仅限于sh,因此您不能使用像〜这样的Bashisms.幸运的是,修复很容易 – 只需用$HOME替换它.同样,需要替换源. (只是一个点).

当然,如果您打算从sh使用它们,那么您获取的脚本不得使用Bash语法.可能最简单的解决方法是将这些东西迁移到您的脚本(或者为Cron创建一个包装脚本来运行).

因为在你的脚本中,如果你愿意,你可以使用bash,当然shebang行正确#!/ bin / bash(如果你需要调整路径)而不是#!/ bin / sh.

如果您由于某种原因不喜欢它,可以通过明确指定crontab文件来内联Bash:

* * * * * bash -c 'source ~/.bash_profile; source ~/.bashrc; ./myscript.sh'

您应该能够看到source:command not found和export:命令在cron发送的电子邮件中找不到.检查错误输出对于故障排除非常重要.

当然,如果你在Ubuntu上有标准的.bashrc,如果你试图从非交互式脚本中获取它,它会立即纾困.也许更好的是将你想要的设置放在另一个文件中的非交互式使用(也许.profile默认会被sh读取)?

猜你在找的Ubuntu相关文章