Shell编程基础-03-一键关闭和开启进程服务

未完待续。

关闭服务进程代码
#针对要关闭的服务,定义一个数组,数组结构可以分为三段:
开头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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值