脚本工具功能描述:
需求描述:
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