需求描述:
- 实现一个脚本工具,该脚本提供类似supervisor功能, 可以对进程进行管理;
- 一键查看所有进程运行状态
- 单个或批量启动进程,单个或批量停止进程
- 提供进程分组功能,可以按组查看进行运行状态,可以按组启动或停止该组内所有进程
脚本拆分–函数
function get_all_process 返回“http nginx mysql datanode” 进程名称字符串
function get_all_group 返回组进程名称
function get_process_info 返回进程详细信息字符串 详细信息包括:运行状态、PID、CPU、MEM、启动时间
注:该函数可以接受一个参数,参数为进程名称
分解:function get_process_pid_by_name process function get_process_ny_pid process_idfunction get_all_process_by_group 返回进程组内所有进名称列表字符串
如 DB组->”mysql postgresql oracle”funcction get_group_by_pn 根据进程名称获取组名
判断函数 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
4app-status.sh 执行有三种情况
1 无参数 列出配置文件中所有进程的运行信息
2 -g GroupName 列出GroupName组内的所有进程
3 process_name1 列出指定进程的运行信息
s测试
1 | sed -n '//,//p' | egrep -v '^$ || \[.*\]' |
完整代码
1 | #!/bin/bash |