进程管理shell脚本

脚本工具功能描述:
    需求描述:
        1、实现一个脚本工具,该脚本提供类似supervisor功能,可以对进程进行管理。
        2、一键查看所有进程运行状态。
        3、单个或批量启动进程,单个或批量停止进程。
        4、提供进程分组功能,可以按组查看进程运行状态,可以按组启动或停止该组内所有进程。
        
    脚本主程序设计:
        function get_all_group
        function get_all_process
        function get_process_pid_by_name
        function get_process_info_by_pid
        function is_group_in_config
        function get_all_process_by_group
        function get_group_by_process_name

cat process.cfg 
[GROUP_LIST]
WEB
DB
HADOOP
YARN

[WEB]
nginx
httpd

[DB]
mysql
postgresql
oracle

[HADOOP]
datanode
namenode
journalnode

[YARN]
resourcemanager
nodemanager

cat app_status.sh 
#!/bin/sh

HOM_DRI="/root/shell"
CONFIG_FILE="process.cfg"
this_id=$$

function get_all_group
{
        G_LIST=`sed -n "/\[GROUP_LIST\]/,/\[.*\]/p" $HOM_DRI/$CONFIG_FILE |egrep -v "(^$|\[*.\])"`
        echo "$G_LIST"
}

function get_all_process
{
        for g in `get_all_group`
        do
                p_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOM_DRI/$CONFIG_FILE |egrep -v "(^$|\[*.\])"`
                echo "$p_LIST"
        done 
}

function get_process_pid_by_name
{
        if [ $# -ne 1 ];then
                return 1
        else
                pids=`ps -ef|grep $1|grep -v grep|grep -v $0|awk '{print $2}'`
                echo $pids
        fi
}

function get_process_info_by_pid
{
        if [ `ps -ef|awk -v pid=$1 '$2==pid{print }'|wc -l` -eq 1 ];then
                pro_status="RUNNING"
        else
                pro_status="STOPED"
        fi
        pro_cpu=`ps aux|awk -v pid=$1 '$2==pid{print $3}'`
        pro_mem=`ps aux|awk -v pid=$1 '$2==pid{print $4}'`
        pro_start_time=`ps -p $1 -o lstart|grep -v STARTED`
}

function is_group_in_config
{
        for gn in `get_all_group`
        do
                if [ $gn == $1 ];then
                        return
                fi
        done
        echo "Group $1 is not in process.cfg"
        return  1
}

function is_process_in_config
{
        for pn in `get_all_process`;do
                if [ $pn == $1 ];then
                        return
                fi
        done
        echo "Process $1 is not in process.cfg"
        return 1
}

function get_all_process_by_group
{
        is_group_in_config $1
        if [ $? -eq 0 ];then
                p_list=`sed -n "/\[$1\]/,/\[.*\]/p" $HOM_DRI/$CONFIG_FILE |egrep -v "(^$|^#|\[.*\])"`
                echo $p_list
        else
                echo "GroupName $1 is not in process.cfg"
        fi
}

function get_group_by_process_name
{
        for gn in `get_all_group`;do
                for pn in `get_all_process_by_group $gn`;do
                        if [ $pn == $1 ];then
                                echo $gn
                        fi
                done
        done
}

function format_print
{
        ps -ef|grep $1|grep -v grep|grep -v $this_id &> /dev/null
        if [ $? -eq 0 ];then
                pids=`get_process_pid_by_name $1`
                for pid in $pids;do
                        get_process_info_by_pid $pid
                        awk -v p_name=$1 \
                                -v g_name=$2 \
                                -v pro_status=$pro_status \
                                -v p_pid=$pid \
                                -v pro_cpu=$pro_cpu \
                                -v pro_mem=$pro_mem \
                                -v pro_start_time="$pro_start_time" \
                                'BEGIN{printf "%-20s%-12s%-10s%-6s%-7s%-10s%-20s\n",p_name,g_name,pro_status,p_pid,pro_cpu,pro_mem,pro_start_time}'
                done
        else
                 awk -v p_name=$1 -v g_name=$2 'BEGIN{printf "%-20s%-12s%-10s%-6s%-7s%-10s%-20s\n",p_name,g_name,"STOPED","NULL","NULL","NULL","NULL"}'
        fi
}

awk 'BEGIN{printf "%-20s%-10s%-10s%-6s%-7s%-10s%-20s\n","ProcessName---------","GroupName---","Status----","PID---","CPU---","MEMORY----","StartTime---"}'

if [ ! -e $HOM_DRI/$CONFIG_FILE ];then
        echo "$CONFIG_FILE is not exist...Please Check.."
        exit 1
fi


if [ $# -gt 0 ];then
        if [ "$1" == "-g" ];then
                shift
                for gn in $@;do
                        is_group_in_config $gn || continue
                        for pn in `get_all_process_by_group $gn`;do
                                is_process_in_config $pn && format_print $pn $gn
                        done
                done
        else
                for pn in $@;do
                        gn=`get_group_by_process_name $pn`
                        is_process_in_config $pn && format_print $pn $gn
                done
        fi
else
        for pn in `get_all_process`;do
                gn=`get_group_by_process_name $pn`
                is_process_in_config $pn && format_print $pn $gn
        done
fi

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值