我们都知道 cron 会忽略“.bashrc”和“.bash_profile”中定义的变量,因此我们必须在 cron 中定义它。我经常做类似问题中写的同样的事情https://unix.stackexchange.com/questions/67940/cron-ignores-variables-define-in-bashrc-and-bash-profile https://unix.stackexchange.com/questions/67940/cron-ignores-variables-defined-in-bashrc-and-bash-profile但 .bashrc 内的全局变量仍然不起作用。我找到了执行它的方法 - 通过使用“set +a”bashrc 脚本定义 sh 脚本。但“来源”仍然不起作用。
SHELL=/bin/bash
BASH_ENV=/root/.bashrc
PATH=:/opt/spark/spark-2.2.0-bin-hadoop2.7/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
SPARK_HOME=/opt/spark/spark-2.2.0-bin-hadoop2.7
MAILTO=root HOME=/
# m h dom mon dow command
* * * * * /bin/bash -c 'source $HOME/.bashrc; echo "SPARK_HOME: '$SPARK_HOME'"; echo "JAVA_HOME: '$JAVA_HOME'"' > /var/log/file.log 2>&1
# DO NOT DELETE LAST LINE
返回日志文件
SPARK_HOME: /opt/spark/spark-2.2.0-bin-hadoop2.7
JAVA_HOME:
还尝试以交互模式执行它,因为它是由 mklement0 编写的
脚本中的源 .bashrc 不起作用 https://stackoverflow.com/questions/43659084/source-bashrc-in-a-script-not-working
* * * * * /bin/bash -i source /root/.bashrc; echo $JAVA_HOME > /var/log/file.log 2>&1
如您所见,SPARK_HOME 是在 crontab 中定义的,而 JAVA_HOME 仅在 .bashrc 中定义。 P.S bashrc java home 定义为“export JAVA_HOME=/usr/jdk1.8.0_131”
当我将 JAVA_HOME 更改为 SPARK_HOME 时,所有不同的 cron 作业都可以正常工作,尝试了不同的 crontab 作业,但答案是相同的。
ubuntu内核版本是
uname -a
Linux 6101c32b9243 4.9.62-21.56.amzn1.x86_64 #1 SMP Thu Nov 16 05:37:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
您的最后一次尝试运行bash
并获取文件,然后退出 Bash 并运行echo
在调用 shell(不是 Bash)中,当然不知道也不关心现已失效的 Bash 进程加载了一些设置,然后在退出时忘记了它们。 (或者,好吧,如果您修复了简单的引用错误以保持source
命令及其参数作为单个字符串。)
表面上的修复很容易;
* * * * * bash -c 'source $HOME/.bashrc; echo "$JAVA_HOME"' >/var/log/file.log 2>&1
The proper然而,修复可能是将所有这些封装在一个单独的脚本中并保留您的crontab
真的很简单。
(您真的确定您的用户被允许覆盖日志文件吗?每分钟替换一次日志似乎相当误导,尽管这对于快速测试以查看作业是否正在运行来说已经足够了。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)