问题描述
我构建了hadoop集群。我们一定会写一个shell脚本去每一个节点上去jps,查看每个节点的进程情况。(这是改正之后的脚本)
#!/bin/bash
conf=/root/sh/cluster.conf
#${1}和${2}的作用是接受脚本的第一个参数和第二个参数
tag=${1}
cmd=${2}
#-f参数是判断cluster.conf存不存在
if [ -f $conf ]
then
#反引号意味着执行这一行时会首先执行反引号中的命令
#反引号中的作用是获取到部署了标识服务的服务器ip列表
for server in `cat ${conf} | grep -v "#" | grep ${tag} | cut -d "," -f 1`
do
echo "*******************$server***************************"
#此脚本的核心命令,作用将双引号中的命令发给$server服务器去执行并将结果返回
ssh $server "source ~/.bash_profile;source /etc/profile;${cmd}"
done
else
echo "Erro:conf does not exist"
fi
本来应该是这样的
[root@hadoop1 sh]# sh excute.sh hdfs "jps"
*******************192.168.16.10***************************
7167 Jps
*******************192.168.16.11***************************
7023 Jps
*******************192.168.16.12***************************
14139 Jps
开始运行这段程序的时候会弹出一个错误:-bash: jps: command not found
解决方案:
错误原因:
在shell脚本写的ssh到其他节点的时候默认是不加载配置文件的。linux并不能去找到java中jps的命令。
解决方案一:
在ssh到其他节点的时候source 一下配置文件。
具体操作为:ssh hadoop$host “source /etc/profile;jps”
解决方案二:
在ssh到其他节点的时候输入jps命令下的绝对路径。
在笔者的linux的jdk的绝对路径为:/opt/module/jdk1.8.0_144/bin这个目录下就有jps的命令。
具体操作为:ssh hadoop$host “/opt/module/jdk1.8.0_144/bin/jps”
解决方案三:
在当前用户的家目录中输入命令ll -a会显示隐藏文件,修改配置文件.bashrc。
.bashrc 是当你登入shell时执行
在.bashrc里面加入source /etc/profile就行了。
但是这种方法不推荐,容易出错
运行结果:
[root@hadoop1 ~]# excute.sh hdfs "jps"
*******************192.168.16.10***************************
7411 NameNode
7833 Jps
7548 DataNode
*******************192.168.16.11***************************
7250 Jps
7108 DataNode
7212 SecondaryNameNode
*******************192.168.16.12***************************
7121 DataNode
7188 Jps