[hadoop]shell脚本执行jps时:-bash: jps: command not found

问题描述

我构建了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

你可能感兴趣的:(linux,linux,hadoop,脚本语言)