不积跬步,无以至千里;不积小流,无以成江海。

Dean's blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

Linux source 命令的奇怪行为

在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

这样的结果,应该是:

  1. source只是在上一次的基础上,再次执行了一次/etc/profile文件;
  2. 配置环境变量时,优先把自己的配置值放前面

 遗漏的问题:

虽然可以通过调整PATH环境变量的方式使source后配置生效,但是PATH的值会越来越长,长此以往,服务器都没有启动的情况下,是否会有引入其它问题?有没有哪种配置是可以避免这种问题?

不允许评论
粤ICP备17049187号-1