在Linux系统中,使用source可以在修改了配置文件后,不重启服务器的情况下使用配置生效。使用的时候可以使用如下两种方式:
source /etc/profile
. /etc/profile
都会让配置生效。但最近在配置Hadoop完全分布式环境时,由于一开始使用了JDK 13.0.2版本,导致yarn无法正常启动,后来将jdk切换为1.8.0_241版本时,发现了source的一些奇怪的行为。大致过程如下:
当前配置:
export JAVA_HOME=/home/hadoop/jdk-13.0.2
export HADOOP_HOME=/home/hadoop/hadoop-3.1.2
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin$HADOOP_HOME/sbin
后来将JAVA_HOME调整为:export JAVA_HOME=/home/hadoop/jdk1.8.0_241,使用source刷新配置,测试发现了异常:
java --version
java 13.0.2 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
which java
~/jdk-13.0.2/bin/java
还是原来的JAVA,但是:
echo $JAVA_HOME
/home/hadoop/jdk1.8.0_241
JAVA_HOME已经是新配置的值。通过查看PATH环境变量发现了问题:
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/hadoop/jdk-13.0.2/bin:/home/hadoop/hadoop-3.1.2/bin:/home/hadoop/hadoop-3.1.2/sbin:/home/hadoop/.local/bin:/home/hadoop/bin
这个是修改/etc/profile前的PATH变量,修改后,再执行:
source /etc/profile
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/hadoop/jdk-13.0.2/bin:/home/hadoop/hadoop-3.1.2/bin:/home/hadoop/hadoop-3.1.2/sbin:/home/hadoop/.local/bin:/home/hadoop/bin:/home/hadoop/jdk1.8.0_241/bin:/home/hadoop/hadoop-3.1.2/bin:/home/hadoop/hadoop-3.1.2/sbin
会发现,source后的内容,会包含了前一个生效配置,这个和PATH的配置是相关的:
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin$HADOOP_HOME/sbin
这样的结果,应该是:
- source只是在上一次的基础上,再次执行了一次/etc/profile文件;
- 配置环境变量时,优先把自己的配置值放前面
遗漏的问题:
虽然可以通过调整PATH环境变量的方式使source后配置生效,但是PATH的值会越来越长,长此以往,服务器都没有启动的情况下,是否会有引入其它问题?有没有哪种配置是可以避免这种问题?