源码bashrc在cron

时间:2018-01-17 10:51:59

标签: linux bash shell cron

我们都知道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

1 个答案:

答案 0 :(得分:3)

您的上一次尝试运行bash并获取文件,然后退出Bash并在调用shell中运行echo,这不是Bash,当然也不知道或者关注现已解散的Bash进程加载了一些设置,然后在退出时忘记了它们。 (或者,如果您修复了简单的引用错误以将source命令及其参数保持为单个字符串,则会发生这种情况。)

表面修复很容易;

* * * * * bash -c 'source $HOME/.bashrc; echo "$JAVA_HOME"' >/var/log/file.log 2>&1

然而,正确的修补程序可能会将所有这些内容封装在一个单独的脚本中,并使crontab非常简单。

(你真的确定你的用户可以覆盖日志文件吗?每分钟更换一次日志似乎是错误的,尽管它足以快速测试以查看作业是否正在运行。 )