【Shell】查询类在哪个jar包,SSH登录指定节点执行相同命令

本文就分享两个自己比较常用的Shell脚本

1、查询类在哪个jar包

在开发当中,我们经常会遇到NoClassDefFoundError或者ClassNotfoundException或者NoSuchMethodError,一般是类缺失,或者类的版本不对

这时候我们就需要知道报错的那个类,在哪个jar包里,以此来定位错误,所以我就写了个脚本

本质上就是用find命令,返回某个目录下的所有jar文件的列表(因为是find命令, 所以并不是只查当前目录,会一层一层往里面翻),然后传入到for循环中,通过jar的拆包能力过滤我要查询的类名,如果查到了,就把对应的jar文件名打印出来

#!/bin/bash
dir="$1"
target="$2"

for i in `find ${1} -type f -name "*.jar"`
do
  jar -tvf $i | grep "$target"
  return=`echo $?`
  if [ "$return" -eq 0 ]; then
    echo "FIND: $i"
  fi
done

执行的方式:

sh find_class_in_jar.sh ${从哪个目录开始查} ${查询具体的某个类}

例如:sh find_class_in_jar.sh /lib/hadoop-current/share/hadoop/ org.apache.commons.lang.StringUtils

2、SSH登录指定节点执行相同命令

可能上一步我们发现jar包有问题,然后大数据的机器也挺多的,我们想登录不同机器都处理下,想做成自动化脚本,我们只需要两个变量

1、需要登录哪些机器

2、要执行什么命令

#!/bin/bash
if [ "$#" -ne 1 ] ; then
    echo "USAGE: $0  server_list_file cmd"
    exit -1
fi

file_name=$1
cmd_str="要执行的多行命令1;
要执行的多行命令2;
exit"

pwd=$(pwd)
serverlist_file="$pwd/$file_name"

if [ ! -e $serverlist_file ] ; then
    echo 'server.list not exist';
    exit 0
fi

while read line
do
    #echo $line
    if [ -n "$line" ] ; then
        echo "DOING--->>>>>" $line "<<<<<<<"
        ssh $line << EOF
        $cmd_str
EOF
        if [ $? -eq 0 ] ; then
            echo "$cmd_str done!"
        else
            echo "error: " $?
        fi
    fi
done < $serverlist_file

如上脚本核心其实就是读到本地的某个文件里每一行的内容(每一行是要执行的机器的主机名或者ip都可以),然后ssh执行对应命令

执行的方式:

可以先执行如下命令,在当前目录生成一个server.list文件,里面是要执行命令的主机名

 awk '{print $2}' /etc/hosts | grep 'cluster' > server.list

然后执行:sh ssh_cmd.sh server.list

这里有个注意点,就是你要切到有免密的用户来执行如上脚本,否则你就需要一遍有一遍的输入yes和对应的密码

以上就是本文的全部内容

菜鸡一只,努力学习,努力上进!!如果哪里说错或者写错,辛苦大家批评指出,谦卑受教虚心接受~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值