我们都知道cron忽略了“.bashrc”和“.bash_profile”中定义的变量,因此我们必须在cron中定义它。我经常做同样的问题https://unix.stackexchange.com/questions/67940/cron-ignores-variables-defined-in-bashrc-and-bash-profile内写的内容,但.bashrc中的全局变量仍然不起作用。我找到了执行它的方法 - 通过使用" set + a"定义sh脚本。 bashrc脚本。但是"来源"仍然没有工作。
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
编写的
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中定义。 Pash在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
答案 0 :(得分:3)
您的上一次尝试运行bash
并获取文件,然后退出Bash并在调用shell中运行echo
,这不是Bash,当然也不知道或者关注现已解散的Bash进程加载了一些设置,然后在退出时忘记了它们。 (或者,如果您修复了简单的引用错误以将source
命令及其参数保持为单个字符串,则会发生这种情况。)
表面修复很容易;
* * * * * bash -c 'source $HOME/.bashrc; echo "$JAVA_HOME"' >/var/log/file.log 2>&1
然而,正确的修补程序可能会将所有这些内容封装在一个单独的脚本中,并使crontab
非常简单。
(你真的确定你的用户可以覆盖日志文件吗?每分钟更换一次日志似乎是错误的,尽管它足以快速测试以查看作业是否正在运行。 )