未完待续。
关闭服务进程代码
#针对要关闭的服务,定义一个数组,数组结构可以分为三段:
开头ARR[0]:要关闭的进程简称
中间ARR[1,SIZE-2]:要关闭的进程在jps里的名字
结尾ARR[SIZE-1]:要关闭的进程执行的操作命令
2020-11-25:开启服务进程代码
#!/bin/bash
HB="hbase HMaster HRegionServer start-hbase.sh"
ZK="zookeeper QuorumPeerMain zkServer.sh_start"
HV="hive RunJar RunJar nohup_hive_--service_?>~/hive2.log_2>&1_&"
YN="yarn NodeManager ResourceManager start-yarn.sh"
HD="dfs DataNode SecondaryNameNode NameNode start-dfs.sh"
function checkStart(){ #1、检查进程是否开启的函数
COUNT=0 #2、定义一个计数器
ARR=$@ #3、输入参数
ARR=($ARR) #4、把输入的参数转为数组
SIZE=$(($#-2)) #5、提取数组的去头去尾的长度,就是服务进程的数量
for i in `seq 1 $SIZE` #6、遍历数组,从第一个到最后一个,包含收尾
do
V=`jps|grep ${ARR[$i]}` #7、筛选出当前进程里的某个服务的所有的进程和进程号
if [ "$V" ] #8、如果筛选到了
then
if [ $1 == "hive" ] #9、Hive的启动命令不太一样,单看;如果数组的第一位是hive
then
V=($V) #10、把筛选出来的进程名转换为数组(122 RunJar,这个就算两个元素)
COUNT=$((${#V[*]}/2)) #11、把筛选到的进程数量赋值给COUNT
break #12、跳出循环,Hive的判断结束
else #13、如果不是hive,就没有上面那么麻烦了
((COUNT++)) #14、筛选出一个,count就加一位,循环结束后,count就是已经启动的进程数量的值
fi
fi
done
if [ $COUNT -eq $SIZE ] #15、如果筛选出来的数量等于数组的长度,也就是该开的服务都已经开启了
then
echo "start $1 successfully" #16、就输出成功
else
echo "fail to start $1" #17、否则启动失败
echo "fail to execute start-all.sh ... please check the reason and retry again"
exit 1 #18、退出
fi
}
function start(){ #19、定义一个启动服务命令的函数
ARR=$@ #20、输入参数赋值给ARR
ARR=($ARR) #21、转为数组
echo "start $1 ..." #22、输出提示信息
OUTPUT=${ARR[$#-1]} #23、$#是数组长度,$#-1是最后一位索引,此时的OUTPUT就是开启服务的命令
OUTPUT="${OUTPUT//_/ }" #24、${STR//WORD/REPLACE}是替换的意思,即把所有的下划线替换为空格
if [[ $OUTPUT =~ ^nohup ]] #25、如果OUTPUT满足开头为nohup的条件,也就是hive的启动命令
then
eval ${OUTPUT/\?/metastore} #26、eval执行两次扫描,第一次替换变量,第二次执行,而倒引号只能里面句子只能扫描一次。执行metastore服务
sleep 3s #27、执行完上一句,休息3s,避免和下一句并发,metastore和hiveserver2启动顺序不能错
eval ${OUTPUT/\?/hiveserver2} #28、执行hiveserver2服务,也用了${STR/WORD/REPLACE}方法
sleep 10s #28、休眠10s
else #如果不是hive服务
OUTPUT=`$OUTPUT` #30、直接执行数组的末位元素,也就是启动命令
fi
checkStart $@ #31、调用checkStart函数检查启动的效果
}
start $HD
start $YN
start $HV
start $ZK
start $HB
关闭服务进程
#!/bin/bash
HB="hbase HMaster HRegionServer stop-hbase.sh"
ZK="zookeeper QuorumPeerMain zkServer.sh_stop>~/zk.log_2>&1"
HV="hive RunJar RunJar kill"
YN="yarn NodeManager ResourceManager stop-yarn.sh"
HD="dfs DataNode SecondaryNameNode NameNode stop-dfs.sh"
function checkStop(){
STOP=0 #2、定义一个计数器STOP,类似Java里的count
ARR=$@ #3、通过函数传入上面的进程字符串,每次传一组,赋值给ARR
ARR=($ARR) #4、进程字符串通过括号的形式转为数组,然后重新赋值给ARR,这样ARR就是一个数组
for i in `seq 1 $(($#-2))` #5、for循环,数组从1开始,到倒数第2位,依次遍历
do
V=`jps|grep ${ARR[$i]}` #6、执行jps命令,然后筛选数组里的内容(进程名)
if [ "$V" ] #7、如果能筛选出来,这个if就继续执行里边的代码
then
((STOP++)) #7、STOP计数器自加,不等于0了
break #8、跳出循环
fi
done
if [ $STOP -eq 0 ] #9、判断:如果STOP等于0,说明进程里已经没有这个进程了
then
echo "stop $1 successfully" #10、输出关闭成功
else
echo "fail to stop $1" #11、如果STOP不等于0,说明还有进程没关掉
fi
}
function stop(){ #1、写一个关闭服务的函数
ARR=$@ #2、读取输入参数
ARR=($ARR) #3、把输入参数转为数组
COUNT=0
for i in `seq 1 $(($#-2))` #4、遍历去头去尾的数组
do
V=`jps|grep ${ARR[$i]}` #5、执行jps指令并依次晒选数组里的参数,如果没匹配到的话V就是null
if [ "$V" ] #6、如果V不是null就执行下面的代码
then
echo "start to stop $1 ..." #7、输出要关闭谁的提示
OUTPUT=${ARR[$#-1]} #8、把执行代码(数组的最后一位,kill)赋值给OUTPUT
((COUNT++))
if [ $OUTPUT = "kill" ] #9、根据最后一位是kill判断,如果是Hive服务,执行下面的语句。
then #10、hive服务和其他命令不太一样,需要kill相关的进程的进程号(runjar前面的数字)
PID=`jps|grep RunJar|awk 'NR==1 {print $1}'` #11、提取出进程号。awk后的NR==1代表第一行,也就是第一个RunJar,{print $1}代表的是输出第一个参数,也就是进程号
OUTPUT=`kill -9 $PID` #12、执行kill -9的命令关闭RunJar
else #13、如果不是Hive服务,执行下面的代码
OUTPUT="${OUTPUT//_/ }" #14、把OUTPUT里存在的空格通过正则替换为下划线,要不然一个元素会被当做两个,主要针对zkServer.sh
OUTPUT=`eval $OUTPUT` #15、在倒引号里执行命令,也就是关闭服务的命令
break
fi
fi
done
if [ $COUNT -eq 0 ] #16、执行完上面的循环之后,理论上应该全部关闭了,最后检查一下是否筛选到了服务进程名
then
echo "no $1 to stop" #17、count等于0,也就是没有服务在运行,就输出完成的提示命令
else
checkStop $@ #18、如果count不等于0,说明还有进程没有被关掉,执行checkStop函数检查是啥情况
fi
}
stop $HB
stop $ZK
stop $HV
stop $YN
stop $HD
启动和关闭的命令执行完之后,可以新建一个脚本,通过调用这个脚本输入参数执行上述的两个脚本
#!/bin/bash
P=($*) #1、把输入参数转化为数组P
L=${#P[*]} #2、把数组P的长度赋值给L
if [ $L -eq 0 ] #3、如果数组P长度为0,也就是没有输入任何参数
then
./start-all.sh #4、启动所有服务
else #5、如果输入了参数,则做以下判断
if [[ $1 =~ ^start$|^stop$|^restart$ ]] #如果输入参数满足:开头结尾是start或stop或restart
then
if [[ $1 =~ ^stop|restart ]]#进一步判断,如果是stop或restart,就执行关闭命令
then
./stop-all.sh
fi
if [[ $1 =~ ^start|restart ]]#如果是start或restart,就执行start命令
then
./start-all.sh #如果是restart,则stop和start都会被执行一次
fi
else
echo "invalid arguement : $1" #如果不满足上面条件,就提示错误
exit 1
fi
fi