我有一个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
当然,如果您打算从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读取)?