本文就分享两个自己比较常用的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和对应的密码
以上就是本文的全部内容
菜鸡一只,努力学习,努力上进!!如果哪里说错或者写错,辛苦大家批评指出,谦卑受教虚心接受~