shell编程系列26--大型脚本工具开发实战
生活随笔
收集整理的這篇文章主要介紹了
shell编程系列26--大型脚本工具开发实战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
shell編程系列26--大型腳本工具開發實戰大型腳本工具開發實戰拆分腳本功能,抽象函數1、function get_all_group 返回進程組列表字符串2、function get_all_process 返回進程名列表字符串"nginx httpd mysql datanode"3、function get_process_info 返回進程詳細信息列表字符串,詳細信息包括:運行狀態、PID、CPU、MEM、啟動時間注:該函數可以接收一個參數,參數為進程名稱4、function get_all_process_by_group 返回進程組內的所有進程名稱列表字符串例子:DB組--> "mysql postgresql oracle"功能函數1代碼:function get_all_group{if [ ! -e $HOME_DIR/$CONFIG_FILE ];thenecho "$CONFIG_file is not exists..Please check"exit 1elseG_LIST=$(sed -n '/\[GROUP_LIST]/,/\[.*\]/p' /root/lesson/9.1/process.cfg | egrep -v "(^$|\[.*\])")echo "$G_LIST"fi}[root@localhost 9.1]# sed -n '/\[GROUP_LIST]/,/\[.*\]/p' process.cfg | grep -v "^$" | grep -v "\[.*\]"WEBDBHADOOPYARN[root@localhost 9.1]# sed -n '/\[GROUP_LIST]/,/\[.*\]/p' process.cfg | egrep -v "(^$|\[.*\])"WEBDBHADOOPYARN功能函數2代碼:function get_all_process{for g in `get_all_group`doP_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`echo $P_LISTdone}功能函數3代碼:# ps -aux 第三列是cpu使用率,第四列是內存使用率[root@localhost ~]# ps -aux | grep httpdroot 17921 0.0 0.2 224020 4996 ? Ss 17:32 0:00 /usr/sbin/httpd -DFOREGROUNDapache 17922 0.0 0.1 224020 2952 ? S 17:32 0:00 /usr/sbin/httpd -DFOREGROUNDapache 17923 0.0 0.1 224020 2952 ? S 17:32 0:00 /usr/sbin/httpd -DFOREGROUNDapache 17924 0.0 0.1 224020 2952 ? S 17:32 0:00 /usr/sbin/httpd -DFOREGROUNDapache 17925 0.0 0.1 224020 2952 ? S 17:32 0:00 /usr/sbin/httpd -DFOREGROUNDapache 17926 0.0 0.1 224020 2952 ? S 17:32 0:00 /usr/sbin/httpd -DFOREGROUNDfunction get_process_info# 進程本身的pidthis_pid=$$function get_process_pid_by_name # 獲取進程的pid{if [ $# -ne 1 ];thenreturn 1else#pids=`ps -ef | grep $1 | grep -v grep | grep -v $this_pid |grep -v $0| awk '{print $2}'`pids=`ps -ef | grep $1 | grep -v grep | grep -v $0| awk '{print $2}'`echo $pidsfi}function get_process_info_by_pid # 獲取進行信息{# awk 中引入一個變量if [ `ps -ef | awk -v pid=$1 '$2==pid{print}' | wc -l` -eq 1 ];thenpro_status="RUNNING"elsepro_status="STOPED"fipro_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`}功能函數4代碼實現:function is_group_in_config{# 如果遍歷不存在就返回1for gn in `get_all_group`;doif [ "$gn" == "$1" ];thenreturnfi donereturn 1}function get_all_process_by_group{is_group_in_configif [ $? -eq 0 ];thenp_list=`sed -n "/\[$1\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|^#|\[.*\])"`echo $p_listelseecho "GroupName $1 is not in process.cfg"fi }程序主流程設計:./app_status.sh執行有三種情況:1、無參數 列出配置文件中所有進程的運行信息2、-g GroupName 列出GroupName組內的所有進程3、process_name1 列出指定進程的運行信息function get_all_group說明:該函數無需輸入任何參數:返回配置文件 process.cfg中所有的組信息,例如web,db等function get_all_process說明:該函數無需輸入任何參數:返回配置文件 process.cfg中所有的進程信息function get_process_pid_by_name說明:該函數接收一個參數,參數為進程名稱:返回值是一個PID的列表,可能有一個PID,也可能有多個function get_process_info_by_pid說明:該函數接收一個參數,參數為進程PID;返回值是一個進程運行信息的列表,列表包含運行狀態:CPU占用率、內存占用率、進程運行時間function is_group_in_config說明 :該函數接收一個參數,參數為組的名稱;返回值是0或1,0代表該組在配置文件中,1代表該組不在配置文件中function get_all_process_by_group說明:該函數接收一個參數,參數為組名稱:返回值是對應組內的所有進程名稱列表function get_group_by_process_name說明:該函數接收一個參數,參數是一個進程名稱:返回值是一個組名function format_print說明:該函數接收兩個參數,第一個參數為process_name,第二個參數為組名稱返回值,是針對每一個進程PID的運行信息function is_process_in_config說明:該函數接收一個參數,參數為進程名稱;返回值是0或1,0代表該進程在配置文件中,1代表進程不在配置文件中配置文件:
[root@localhost 9.1]# cat /root/lesson/9.1/process.cfg
[GROUP_LIST]
WEB
DB
HADOOP
YARN[WEB]
nginx
httpd[DB]
mysql
postgresql
oracle[HADOOP]
datanode
namenode
journalnode[YARN]
resourcemanager
nodemanager# 程序腳本
[root@localhost 9.1]# cat /data/shell/app_status.sh
#!/bin/bash
#
# Func: Get Process Status In process.cfg# Define Variables
HOME_DIR="/root/lesson/9.1"
CONFIG_FILE="process.cfg"
# 進程本身的pid
this_pid=$$# 獲取所有的組
function get_all_group
{G_LIST=$(sed -n '/\[GROUP_LIST]/,/\[.*\]/p' $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])")echo $G_LIST
}#for g in `get_all_group`;do
# echo $g
#done# 獲取所有進程
function get_all_process
{for g in `get_all_group` doP_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`echo $P_LISTdone
}# 通過pid獲取進程名稱
function get_process_pid_by_name
{if [ $# -ne 1 ];thenreturn 1else#pids=`ps -ef | grep $1 | grep -v grep | grep -v $this_pid |grep -v $0| awk '{print $2}'`pids=`ps -ef | grep $1 | grep -v grep | grep -v $0| awk '{print $2}'`echo $pidsfi
}# 通過pid 獲取進程信息
function get_process_info_by_pid
{# awk 中引入一個變量if [ `ps -ef | awk -v pid=$1 '$2==pid{print}' | wc -l` -eq 1 ];thenpro_status="RUNNING"elsepro_status="STOPED"fipro_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`#echo "pro_status=$pro_status"#echo "pro_cpu=$pro_cpu"#echo "pro_mem=$pro_mem"#echo "pro_start_time=$pro_start_time"
}# 判斷輸入的組是否在配置文件中
function is_group_in_config
{# 如果遍歷不存在就返回1for gn in `get_all_group`;doif [ "$gn" == "$1" ];thenreturn 0fi doneecho "Group $1 is not in process.cfg"return 1
}# 判斷進程是否在配置中
function is_process_in_config
{for pn in `get_all_process`;doif [ $pn == $1 ];thenreturnfidoneecho "Process $1 is not in process.cfg"return 1
}# 通過組名獲取組下所有的進程
function get_all_process_by_group
{# 判斷輸入的組名是否在group中is_group_in_config $1if [ $? -eq 0 ];thenp_list=`sed -n "/\[$1\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|^#|\[.*\])"`echo $p_listelseecho "GroupName $1 is not in process.cfg"fi
}# 通過進程名稱獲取所在的組
function get_group_by_process_name
{for gn in `get_all_group`;dofor pn in `get_all_process_by_group $gn`;do#echo "pn=$pn"if [ $pn == $1 ];thenecho "$gn"fidone done
}#if [ ! -e $HOME_DIR/$CONFIG_FILE ];then
# echo "$CONFIG_FILE is not exists..please check.."
#fi#is_group_in_config $1 && echo "exists" || echo "not exists"#get_all_process_by_group $1function format_print
{ps -ef | grep $1 | grep -v grep | grep -v $this_pid &> /dev/nullif [ $? -eq 0 ];thenpids=`get_process_pid_by_name $1`#echo "pids=$pids"for pid in $pids;doget_process_info_by_pid $pidawk -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%-20s%-20s%-20s%-20s%-20s%-20s\n",p_name,g_name,p_status,p_pid,p_cpu,p_mem,p_start_time}'# -v 定義的參數需要用雙引號引起來"",否則會報錯 awk: fatal: cannot open file `15' for reading (No such file or directory),主要是因為 p_start_time 中間有空格,需要""雙引號引起來#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%-20s%-20s%-20s%-20s%-20s%-20s\n",p_name,g_name,p_pid,p_status,p_cpu,p_mem,p_start_time}'doneelseawk -v p_name=$1 -v g_name=$2 'BEGIN{printf "%-20s%-20s%-20s%-20s%-20s%-20s%-20s\n",p_name,g_name,"NULL","Stopped","NULL","NULL","NULL"}'fi
}# 打印頭信息
awk 'BEGIN{printf "%-20s%-20s%-20s%-20s%-20s%-20s%-20s\n","ProcessName---","GroupName---","Status---","Pid---","CPU---","MEMORY---","StartTime---"}'if [ $# -gt 0 ];then# 傳遞的是組if [ "$1" == "-g" ];thenshift# 遍歷傳遞參數的組for gn in $@;do# 組名是否在配置文件中, 執行不成功才會 continue 跳過is_group_in_config $gn || continuefor pn in `get_all_process_by_group $gn`;dois_process_in_config $pn && format_print $pn $gndonedone# 傳遞的是進程名elsefor pn in $@;dogn=`get_group_by_process_name $pn`is_process_in_config $pn && format_print $pn $gndonefi
else# 不添加參數,打印所有進程for pn in `get_all_process`;dogn=`get_group_by_process_name $pn`#echo "gn=$gn, pn=$pn"is_process_in_config $pnif [ $? -eq 0 ];then#echo "format print"format_print $pn $gnfidone
fi#format_print nginx WEB#group_name=`get_group_by_process_name $1`
#echo $group_name
[root@localhost 9.1]# # 常用使用方法[root@localhost shell]# ./app_status.sh
ProcessName--- GroupName--- Status--- Pid--- CPU--- MEMORY--- StartTime---
nginx WEB RUNNING 18492 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18493 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18494 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18495 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18496 0.0 0.1 Sat Jun 15 14:07:18 2019
httpd WEB RUNNING 51138 0.0 0.2 Sat Jun 15 17:41:16 2019
httpd WEB RUNNING 87150 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87151 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87152 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87153 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87154 0.0 0.1 Sun Jun 16 03:33:00 2019
mysql DB RUNNING 11085 0.0 0.0 Sat Jun 15 11:46:18 2019
mysql DB RUNNING 11246 0.0 4.8 Sat Jun 15 11:46:18 2019
postgresql DB NULL Stopped NULL NULL NULL
oracle DB NULL Stopped NULL NULL NULL
datanode HADOOP NULL Stopped NULL NULL NULL
namenode HADOOP NULL Stopped NULL NULL NULL
journalnode HADOOP NULL Stopped NULL NULL NULL
resourcemanager YARN NULL Stopped NULL NULL NULL
nodemanager YARN NULL Stopped NULL NULL NULL
[root@localhost shell]# ./app_status.sh -g WEB
ProcessName--- GroupName--- Status--- Pid--- CPU--- MEMORY--- StartTime---
nginx WEB RUNNING 18492 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18493 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18494 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18495 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18496 0.0 0.1 Sat Jun 15 14:07:18 2019
httpd WEB RUNNING 51138 0.0 0.2 Sat Jun 15 17:41:16 2019
httpd WEB RUNNING 87150 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87151 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87152 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87153 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87154 0.0 0.1 Sun Jun 16 03:33:00 2019
[root@localhost shell]# ./app_status.sh -g WEB DB
ProcessName--- GroupName--- Status--- Pid--- CPU--- MEMORY--- StartTime---
nginx WEB RUNNING 18492 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18493 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18494 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18495 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18496 0.0 0.1 Sat Jun 15 14:07:18 2019
httpd WEB RUNNING 51138 0.0 0.2 Sat Jun 15 17:41:16 2019
httpd WEB RUNNING 87150 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87151 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87152 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87153 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87154 0.0 0.1 Sun Jun 16 03:33:00 2019
mysql DB RUNNING 11085 0.0 0.0 Sat Jun 15 11:46:18 2019
mysql DB RUNNING 11246 0.0 4.8 Sat Jun 15 11:46:18 2019
postgresql DB NULL Stopped NULL NULL NULL
oracle DB NULL Stopped NULL NULL NULL
[root@localhost shell]# ./app_status.sh nginx httpd
ProcessName--- GroupName--- Status--- Pid--- CPU--- MEMORY--- StartTime---
nginx WEB RUNNING 18492 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18493 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18494 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18495 0.0 0.1 Sat Jun 15 14:07:18 2019
nginx WEB RUNNING 18496 0.0 0.1 Sat Jun 15 14:07:18 2019
httpd WEB RUNNING 51138 0.0 0.2 Sat Jun 15 17:41:16 2019
httpd WEB RUNNING 87150 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87151 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87152 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87153 0.0 0.1 Sun Jun 16 03:33:00 2019
httpd WEB RUNNING 87154 0.0 0.1 Sun Jun 16 03:33:00 2019
[root@localhost shell]#
?
轉載于:https://www.cnblogs.com/reblue520/p/11039423.html
總結
以上是生活随笔為你收集整理的shell编程系列26--大型脚本工具开发实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序云开发不完全指北
- 下一篇: 你被人工智能给忽悠了吗?原来我们曾经认为