Shell之脚本功能概述

需求描述:

  1. 实现一个脚本工具,该脚本提供类似supervisor功能, 可以对进程进行管理;
  2. 一键查看所有进程运行状态
  3. 单个或批量启动进程,单个或批量停止进程
  4. 提供进程分组功能,可以按组查看进行运行状态,可以按组启动或停止该组内所有进程

脚本拆分–函数

  1. function get_all_process 返回“http nginx mysql datanode” 进程名称字符串

  2. function get_all_group 返回组进程名称

  3. function get_process_info 返回进程详细信息字符串 详细信息包括:运行状态、PID、CPU、MEM、启动时间
    注:该函数可以接受一个参数,参数为进程名称
    分解:

    function get_process_pid_by_name process
    function get_process_ny_pid process_id
  4. function get_all_process_by_group 返回进程组内所有进名称列表字符串
    如 DB组->”mysql postgresql oracle”

  5. funcction get_group_by_pn 根据进程名称获取组名

  6. 判断函数 is_group_in_config/is_process_in_config


注意:
^$表示以空行开始
$# 参数的个数
$$ 表示子进程id
$0 表示进程本身
shift命令左移,如果调用函数或运行脚本时,参数丢掉第一个


实现

  • status-app.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91

    #!/bin/bash
    #
    # Function: show group data

    HOME_DIR="/opt/datasets/shell/demo01"
    CONFIG_FILE="process.cfg"


    function get_all_group
    {
    glist=$(sed -n '/\[GROUP_LIST\]/,/\[.*\]/p' $HOME_DIR/$CONFIG_FILE | egrep -v '(^$|\[.*\])')
    echo $glist

    }
    # echo `get_all_group`
    function get_all_process
    {

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

    function get_process_pid_by_name
    {
    if [ $# -ne 1 ];then
    return 1
    else
    pids=`ps -ef | grep $1 | grep -v $0 | grep -v grep | 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
    process_status="STARTED"
    else
    process_status="STOPPEND"
    fi

    process_cpu=`ps -aux | awk -v pid=$1 '$2==pid{print $3}'`
    process_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
    return 1
    }

    function get_all_process_by_group
    {
    is_group_in_config $1
    if [ $? -eq 1 ];then
    echo "GroupName $1 is not in config..."
    fi

    p_list=$(sed -n "/\[$1\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])")
    echo $p_list
    }
    # get_process_pid_by_name $1

    # echo $pids

    # get_process_info_by_pid 1380

    # echo "$process_status $process_cpu $process_mem $pro_start_time"

    if [ ! -e $CONFIG_FILE ]; then
    echo "$CONFIG_FILE not foud!"
    exit 1
    fi

    get_all_process_by_group DB
    #
    #
    # for g in `get_all_process`
    # do
    # echo $g
    # done

    程序设计主流程

    1
    2
    3
    4
    app-status.sh 执行有三种情况
    1 无参数 列出配置文件中所有进程的运行信息
    2 -g GroupName 列出GroupName组内的所有进程
    3 process_name1 列出指定进程的运行信息

s测试

1
2
3
4
5
6
7
8
sed -n '//,//p' | egrep -v '^$ || \[.*\]'

[root@node1 ~]# ps -aux | grep mysql
mysql 1380 0.2 5.3 1280344 207416 ? Sl 15:06 0:26 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root 4453 0.0 0.0 112728 996 pts/3 S+ 18:27 0:00 grep --color=auto mysql
[root@node1 ~]# ps -p 1380 -o lstart
STARTED
Sat Jan 11 15:06:23 2020

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/bash
#
# Function: show group data

HOME_DIR="/opt/datasets/shell/demo01"
CONFIG_FILE="process.cfg"
this_pid=$$


function get_all_group
{
glist=$(sed -n '/\[GROUP_LIST\]/,/\[.*\]/p' $HOME_DIR/$CONFIG_FILE | egrep -v '(^$|\[.*\])')
echo $glist

}
# echo `get_all_group`
function get_all_process
{

for g in `get_all_group`
do
plist=$(sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v '(^$|\[.*\])')
echo $plist
done
}

function get_process_pid_by_name
{
if [ $# -ne 1 ];then
return 1
else
pids=`ps -ef | grep $1 | grep -v grep | grep -v $this_pid | awk -v pname=$1 '$1==pname{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
process_status="STARTED"
else
process_status="STOPPEND"
fi

process_cpu=`ps -aux | awk -v pid=$1 '$2==pid{print $3}'`
process_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
return 1
}

function get_all_process_by_group
{
is_group_in_config $1
if [ $? -eq 1 ];then
echo "GroupName $1 is not in config..."
fi

p_list=$(sed -n "/\[$1\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])")
echo $p_list
}
function get_group_by_pn
{
for gn in `get_all_group`
do
for pn in `get_all_process_by_group $gn`
do
if [ $1 == $pn ];then
echo $gn
fi
done
done

}
function is_process_in_config
{
for pn in `get_all_process`
do
if [ $1 == $pn ];then
return
fi
done
return 1
}
function format_output
{
ps -ef | grep $1 |grep -v grep | grep -v $this_pid &> /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 p_status=$process_status \
-v p_cpu=$process_cpu \
-v p_mem=$process_mem \
-v p_time="$pro_start_time" \
'BEGIN{printf "%-15s%-15s%-15s%-15s%-15s%-15s\n",p_name,g_name,p_status,p_cpu,p_mem,p_time}'
done
else
awk -v p_name=$1 \
-v g_name=$2 \
-v p_status=$process_status \
-v p_cpu=$process_cpu \
-v p_mem=$process_mem \
-v p_time="$pro_start_time" \
'BEGIN{printf "%-15s%-15s%-15s%-15s%-15s%-15s\n",p_name,g_name,"NULL","NULL","NULL","NULL"}'
fi
}
# get_process_pid_by_name $1

# echo $pids

# get_process_info_by_pid 1380

# echo "$process_status $process_cpu $process_mem $pro_start_time"

if [ ! -e $CONFIG_FILE ]; then
echo "$CONFIG_FILE not foud!"
exit 1
fi

# for pn in `get_all_process`
# do
# get_process_pid_by_name $pn
# echo $pids
#
# done
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
format_output $pn $gn
done
done
else
for pn in $@
do
is_process_in_config $pn || continue
gname=`get_group_by_pn $pn`
format_output $pn $gn
done
fi
else
for pn in `get_all_process`
do
gname=`get_group_by_pn $pn`
format_output $pn $gname
done
fi

## get_group_by_pn mysql
## get_all_process_by_group DB1
##
##
## for g in `get_all_process`
## do
## echo $g
## done
## get_process_info_by_pid 1380
#get_process_pid_by_name mysql

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×