记录一次ssh远程别的机器找不到java环境的问题

环境:
hadoop001
hadoop002
hadoop003
三台机器,在hadoop001机器上远程启动hadoop002机器的zookeeper时候无法找到java环境,不能远程启动hadoop002机器上的zookeeper
[hadoop@hadoop001 ~]$ ssh hadoop002 ${ZOOKEEPER_HOME}/bin/zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
虽然这里提示成功了,但是在hadoop002机器上jps并没有看到zookeeper的进程...

排错过程:
开始找zookeeper的输出日志
先找的是zookeeper的conf目录下配置文件 zoo.cfg 发现里面只配置了
dataDir=/home/hadoop/data/zookeeper
只有这一个输出目录,所以并不是我们想要的
然后在conf目录下看到一个log4j.properties 日志文件,但是很遗憾,这并不是zookeeper的日志输出文件,然后决定去查看一下zookeeper启动的shell脚本中是不是有我们想要的信息呢?
[hadoop@hadoop002 bin]$ cat zkServer.sh 
#!/usr/bin/env bash
..........很多........
发现有一段
if [ ! -w "$ZOO_LOG_DIR" ] ; then
mkdir -p "$ZOO_LOG_DIR"
fi

_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
然后找到了zookeeper输出日志为zookeeper.out文件
然后使用root用户权限执行:find / -name "zookeeper.out"
[root@hadoop002 ~]# find / -name "zookeeper.out"
/home/hadoop/tmp/zookeeper.out
查看日志输出:
[root@hadoop002 tmp]# cat zookeeper.out 
日志报错如下:
nohup: failed to run command ‘java’: No such file or directory

意思是通过ssh远程到hadoop001机器上找不到java????
测试:
[hadoop@hadoop001 ~]$ ssh hadoop002 which java
which: no java in (/usr/local/bin:/usr/bin)
使用which java找不到

但是使用echo 输出JAVA_HOME是可以找到java环境的
[hadoop@hadoop001 ~]$ ssh hadoop002 echo $JAVA_HOME
/usr/java/jdk1.8.0_45

按道理说ssh后是会刷新环境变量的啊,怎么会找不到java?是不是感觉很奇怪?

于是继续回到zookeeper启动脚本中
[hadoop@hadoop002 bin]$ cat zkServer.sh 
.......很多..........
if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then
  . "$ZOOBINDIR/../libexec/zkEnv.sh"
else
  . "$ZOOBINDIR/zkEnv.sh"
fi
发现有这么一段,然后怀着好奇的心cat zkEnv.sh
[hadoop@hadoop002 bin]# cat zkEnv.sh 
#!/usr/bin/env bash
........很多...........
发现这一段有关于java的引用
if [ "$JAVA_HOME" != "" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  JAVA=java
fi
这一段的意思是:如果JAVA_HOME不为空的话就JAVA="$JAVA_HOME/bin/java",但是这一段应该是没有问题的,关键就是下一段 JAVA=java,什么鬼???
于是决定修改人家的启动脚本,将java路径写死
if [ "$JAVA_HOME" != "" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
 #JAVA=java
JAVA=/usr/java/jdk1.8.0_45/bin/java
fi
然后进行测试:
[hadoop@hadoop001 ~]$ ssh hadoop002 ${ZOOKEEPER_HOME}/bin/zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
通过jps查看到了zookeeper进程
[hadoop@hadoop002 ~]$ jps
4167 QuorumPeerMain
4199 Jps
问题好像是解决了...但是
[hadoop@hadoop001 ~]$ ssh hadoop002 which java
which: no java in (/usr/local/bin:/usr/bin)
还是找不到java

既然找不到java肯定还是有问题的,于是把zkEnv.sh脚本还原
因为我的机器配置的java都是面向所有用户的,既然找不到全局的java,那么我在hadoop002的个人环境变量配置文件 .bash_profile或者 .bashrc中再配置一个JAVA_HOME会不会就可以了呢?试试
[hadoop@hadoop002 ~]$ vi .bashrc
....很多...
#加上java环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_45
export PATH=$JAVA_HOME/bin:$PATH

[hadoop@hadoop002 ~]$ source .bashrc
##发现在.bash_profile文件中配置不行,但是在.bashrc文件中配置是可以的
[hadoop@hadoop001 ~]$ ssh hadoop002 which java
/usr/java/jdk1.8.0_45/bin/java
[hadoop@hadoop001 ~]$ ssh hadoop002 ${ZOOKEEPER_HOME}/bin/zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
##然后去hadoop002机器上jps发现成功启动
[hadoop@hadoop002 ~]$ jps
2323 QuorumPeerMain
2343 Jps



小结:ssh在远程登陆的时候会加载你远程的那台机器的.bashrc文件,不会加载profile环境变量文件
然后普通的那种使用账号密码登录的会加载profile环境变量文件

如果发现进程不能成功启动的,一定要去看输出日志
1.日志文件一般就在配置文件中配置的有
2.去启动脚本中查看日志输出路径

补充说明:
Linux的环境变量可在多个文件中配置,如/etc/profile/etc/profile.d/*.sh~/.bashrc~/.bash_profile等,下面说明上述几个文件之间的关系和区别。
bash的运行模式可分为login shell和non-login shell。
例如,我们通过终端,输入用户名、密码,登录系统之后,得到就是一个login shell。而当我们执行以下命令ssh hadoop103 command,在hadoop103执行command的就是一个non-login shell。
这两种shell的主要区别在于,它们启动时会加载不同的配置文件

  • login shell :login shell启动时会加载/etc/profile~/.bash_profile~/.bashrc
  • non-login shell : non-login shell启动时会加载~/.bashrc,而在加载~/.bashrc(实际是~/.bashrc中加载的/etc/bashrc)或/etc/profile时,都会执行如下代码片段,
    在这里插入图片描述
    因此不管是login shell还是non-login shell,启动时都会加载/etc/profile.d/*.sh中的环境,所以我们可以将一些环境变量配置到/etc/profile.d 目录下 以 .sh结尾的文件中。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值