拆分脚本功能,抽象函数

  • 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 返回进程组内的所有进程名称列表字符串

配置文件

process.cfg

[GROUP_LIST]
WEB
DB
HADOOP
YARN [WEB]
nginx
httpd [DB]
mysql
postgresql
oracle [HADOOP]
datanode
namenode
journalnode [YARN]
resourcemanager
nodemanager

  

功能函数代码 1 (获取进程组列表)

sed -n '/\[GROUP_LIST]/,/\[.*\]/p' process.cfg | grep -v "^$" | grep -v "\[.*\]"

使用egrep 优化

sed -n '/\[GROUP_LIST]/,/\[.*\]/p' process.cfg | egrep -v "(^$|\[.*\])"

封装函数

app_status.sh

#!/bin/bash
#
# Func: Get Process Status In process.cfg # Define Variables
HOME_DIR="/home/roo/Desktop/shell_code/day9"
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

执行脚本

sh app_status.sh

功能函数代码 2 (获取每个进程组中的进程)

app_status.sh

#!/bin/bash
#
# Func: Get Process Status In process.cfg # Define Variables
HOME_DIR="/home/roo/Desktop/shell_code/day9"
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`
do
P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`
echo $P_LIST
done
} echo `get_all_process`

  

执行脚本

sh app_status.sh

功能函数代码 3 (获取每个进程组中的进程、返回进程详细信息列表字符串,详细信息包括:运行状态、PID、CPU、MEM、启动时间)

ps -aux | grep nginx

第二列是进程的id第三列是cpu使用率,第四列是内存使用率

功能拆分1 :

get_process_pid_by_name   根据进程的名字获取进程 id  

#!/bin/bash
#
# Func: Get Process Status In process.cfg # Define Variables
HOME_DIR="/home/roo/Desktop/shell_code/day9"
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`
do
P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`
echo $P_LIST
done
} this_pid=$$
function get_process_pid_by_name # 获取进程的pid
{
if [ $# -ne 1 ];then
return 1
else
#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 $pids
fi
} get_process_pid_by_name $1

执行脚本

sh app_status.sh nginx

功能拆分2 :

get_process_info_by_pid 根据进程 id 获取进程详细信息  

#!/bin/bash
#
# Func: Get Process Status In process.cfg # Define Variables
HOME_DIR="/home/roo/Desktop/shell_code/day9"
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`
do
P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`
echo $P_LIST
done
} this_pid=$$
function get_process_pid_by_name # 获取进程的pid
{
if [ $# -ne 1 ];then
return 1
else
#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 $pids
fi
}
function get_process_info_by_pid # 获取进行信息
{
# awk 中引入一个变量
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`
} get_process_info_by_pid $1 echo "$pro_status $pro_cpu $pro_mem $pro_start_time"

运行脚本

sh app_status.sh 1229

功能函数代码 4

is_group_in_config: 判断输入的组是否在配置文件中

get_all_process_by_group: 根据输入的组输出当前组下的进程名

#!/bin/bash
#
# Func: Get Process Status In process.cfg # Define Variables
HOME_DIR="/home/roo/Desktop/shell_code/day9"
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`
do
P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`
echo $P_LIST
done
} this_pid=$$
function get_process_pid_by_name # 获取进程的pid
{
if [ $# -ne 1 ];then
return 1
else
#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 $pids
fi
}
function get_process_info_by_pid # 获取进行信息
{
# awk 中引入一个变量
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
{
# 如果遍历不存在就返回1
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 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
} is_group_in_config $1 && echo exist || echo not exist
get_all_process_by_group $1

  

执行脚本

sh app_status.sh WEB

程序主流程设计及代码实现

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代表进程不在配置文件中
#!/bin/bash
#
# Func: Get Process Status In process.cfg # Define Variables
HOME_DIR=""/home/roo/Desktop/shell_code/day9""
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`
do
P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" $HOME_DIR/$CONFIG_FILE | egrep -v "(^$|\[.*\])"`
echo $P_LIST
done
} # 通过pid获取进程名称
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 |grep -v $0| awk '{print $2}'`
pids=`ps -ef | grep $1 | grep -v grep | grep -v $0| awk '{print $2}'`
echo $pids
fi
} # 通过pid 获取进程信息
function get_process_info_by_pid
{
# awk 中引入一个变量
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` #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
{
# 如果遍历不存在就返回1
for gn in `get_all_group`;do
if [ "$gn" == "$1" ];then
return 0
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
{
# 判断输入的组名是否在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
#echo "pn=$pn"
if [ $pn == $1 ];then
echo "$gn"
fi
done
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 $1 function format_print
{
ps -ef | grep $1 | grep -v grep | grep -v $this_pid &> /dev/null
if [ $? -eq 0 ];then
pids=`get_process_pid_by_name $1`
#echo "pids=$pids"
for pid in $pids;do
get_process_info_by_pid $pid 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_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}'
done
else
awk -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" ];then
shift
# 遍历传递参数的组
for gn in $@;do
# 组名是否在配置文件中, 执行不成功才会 continue 跳过
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`
#echo "gn=$gn, pn=$pn"
is_process_in_config $pn
if [ $? -eq 0 ];then
#echo "format print"
format_print $pn $gn
fi
done
fi #format_print nginx WEB #group_name=`get_group_by_process_name $1`
#echo $group_name

  

执行脚本 输出所有组内的进程信息

sh app_status1.sh

执行脚本 输出指定组内的进程信息

 sh app_status1.sh -g WEB

输出指定组内单个进程的信息 

sh app_status1.sh -g WEB DB

  

shell 大型脚本工具开发实战的更多相关文章

  1. shell编程系列26--大型脚本工具开发实战

    shell编程系列26--大型脚本工具开发实战 大型脚本工具开发实战 拆分脚本功能,抽象函数 .function get_all_group 返回进程组列表字符串 .function get_all_ ...

  2. shell小脚本工具合集

    1.将指定内容写入文件 echo "hello world" > file.txt echo "hello world" >> file.tx ...

  3. chrome拓展开发实战:页面脚本的拦截注入

    原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...

  4. Linux shell批量执行scp脚本工具

    转载: linux shell + expect:批量scp脚本工具             2011-09-13 15:51:06 分类: Python/Ruby 最近在准备一个部署的任务,其中有一 ...

  5. 开始你的第一个npm脚本工具

    在实际开发中,一般刚开始一个项目或者刚接手一个项目,我们会运行 npm install 下载安装所有依赖, 在实际开发中,可能也会使用各种命令行-- 来提高我们开发的效率. 与它相处了这么久,你真的了 ...

  6. Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录

    第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...

  7. Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

    Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...

  8. AI应用开发实战 - 从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...

  9. 包建强的培训课程(7):iOS企业级开发实战

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

随机推荐

  1. Spring cloud微服务安全实战-3-8API安全机制之Https

    Https访问 1.验证双方的身份. 2.一旦建立连接,对数据进行封装加密 这里先生成一个自己自签的证书,不是第三方颁发的,第三方颁发的要花钱. 第二是做一些配置,让程序支持https 安装了java ...

  2. 利用postman生成各种编程语言的代码

    原文来源:https://learning.getpostman.com/docs/postman/sending_api_requests/generate_code_snippets/ 在Post ...

  3. Python环境的导入导出

    有很多情况下,需要做Python环境的迁移,比如在本地开发环境搭建了某套架构,并安装了需要依赖模块,那么就需要将原有的环境导出到目的机器上,可以使用pip freeze导出. 导出环境,在开发机器上设 ...

  4. Python动态构造类:借助强悍的内建 type()

    内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下: type(name, bases, dict) 返回一个新的type对象. 基本上是 class 语句的动态形式. 参数: ...

  5. TroubleShooting经验总结

    1.WinDbg是微软开发的免费源代码级的调试工具.WinDbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件.WinDbg对于dump文件的调试可以通过菜单设置Symbol Fi ...

  6. SET IDENTITY_INSERT的用法,具体去体验一下

    如果将值插入到表的标识列中,需要启用 SET IDENTITY_INSERT. 举例如下: 创建表Orders.Products,Orders表与Products表分别有标识列OrderID与Prod ...

  7. IdentityServer4 学习二

    进入identityserver4的官网:https://identityserver.io/ 找到文档 从overview下开始按照官方文档练习: 安装自定义模板 dotnet new -i Ide ...

  8. scau 10692 XYM-入门之道

    题目:http://paste.ubuntu.com/14157516/ 思路:判断一个西瓜,看看能不能直接吃完,如果能,就吃了.但是:如果不能,就要分成两半,就这样分割,不用以为要用到n维数组,用一 ...

  9. (3)Spring Boot日志

    文章目录 选择哪一种日志框架 日志的使用 Spring Boot 日志使用 选择哪一种日志框架 市面上日志门面有: JCL(Jakart Commons Logging) .SLF4J(Simple ...

  10. java面向函数编程简单应用

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...