1. 脚本工具功能概述
需求描述:
- 实现一个脚本工具,该脚本提供类似supervisor功能,可以对进程进行管理;
- 一键查看所有进程运行状态;
- 单个或批量启动进程,单个或批量停止进程;
- 提供进程分组功能,可以按组查看进程运行状态,可以按组启动或停止该组内所有进程;
2. 拆分脚本功能,抽象函数
- function get_all_process 返回进程名称列表字符串"nginx httpd mysql datanode"
- function get_all_group 返回进程组列表字符串
- function get_process_info(该函数可以接收一个参数,参数为进程名称) 返回进程详细信息列表字符串,详细信息包括:运行状态、PID、CPU、MEM、启动时间
- function get_all_process_by_group 返回进程组内的所有进程名称列表字符串
DB组--> "mysql postgresql oracle"
3. 功能函数
[GROUP_LIST]
WEB
DB
HADOOP
YARN
[WEB]
nginx
httpd
[DB]
mysql
postgresql
oracle
[HADOOP]
datanode
namenode
journalnode
[YARN]
resourcemanager
nodemanager
[nginx]
description="Web Server 1"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/web-nginx.conf
[httpd]
description="Web Server 2"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/web-httpd.conf
[mysql]
description="High Performance DataBase"
program_name=tail
$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用
#!/bin/bash
HOME_DIR="/root/lesson/9.1"
CONFIG_FILE="process.cfg"
this_pid=$$
function get_all_group
{
G_LIST=`sed -n '/\[GROUP_LIST\]/,/\[.*\]/p' $HOME_DIR$CONFIG_FILE | grep -v "^$" | grep -v "\[.*\]"`
echo "$G_LIST"
}
function get_all_process
{
for g in `get_all_group`
do
P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR$CONFIG_FILE | grep -v "^$" | grep -v "\[.*\]"`
echo "$P_LIST"
done
}
function get_prcess_pid_by_name
{
if[$
return 1
pids=`ps -ef | grep $1 | grep -v grep |grep -v $this_pid| grep -v $0| awk '{print $2}'`
echo $pids
}
function get_prcess_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=`pa aux | awk -v pid=$1 '$2==pid{print $3}'`
pro_mem=`pa aux | awk -v pid=$1 '$2==pid{print $4}'`
pro_start_time=`pa -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" $HOME_DIR$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 formate_print
{
ps -ef|grep $1|grep -v grep |grep -v $this_pid $> /dev/null
if[$? -eq 0];then
pids=`get_prcess_pid_by_name $1`
for pid in $pids;do
get_prcess_info_by_pid $1
awk -v p_name=$1 \
-v g_name=$2 \
-v p_status=$pro_status \
-v p_pid=$pid \
-v p_cpu=$pro_cpu \
-v p_mem=$pro_mem \
-v p_start_time="$pro_start_time" \
'BEGIN{printf "%-20s%-10s%-10S%-6s%-7s%-10s%-20s\n",
p_name,g_name,p_status,p_pid,p_cpu,p_mem,p_start_time}'
done
else
awk -v p_name=$1 \
-v g_name=$2 \
'BEGIN{printf "%-20s%-10s%-10S%-6s%-7s%-10s%-20s\n",
p_name,g_name,"STOPED","NULL","NULL","NULL","NULL"}'
fi
}
if[!-e $HOME_DIR$CONFIG_FILE];then
echo "$CONFIG_FILE is not exist..please check"
exit 1
awk 'BEGIN{printf "%-20s%-10s%-10S%-6s%-7s%-10s%-20s\n","ProcessName----","GroupName----","Status----",
"PID----","CPU----","MEMORY----","StartTime----"}'
if[$
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 && formate_print $pn $gn
done
done
else
for pn in $@;do
gn=`get_group_by_process_name $pn`
is_process_in_config $pn && formate_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 && formate_print $pn $gn
done
fi