第七课 Shell脚本编程-大型脚本工具开发实战

文章目录

  • 第七课 Shell脚本编程-大型脚本工具开发实战
    • 第一节 需求描述
    • 第二节 脚本的特殊参数
    • 第三节 功能函数的实现
    • 第四节 程序主流程设计及代码实现

第一节 需求描述

  1. Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
  2. 需求描述
    • 实现一个脚本工具,该脚本提供类似supervisor功能,可以对进程进行管理;
    • 一键查看所有进程运行状态
    • 单个或批量启动进程,单个或批量停止进程
    • 提供进程分组功能,可以按组查看进行运行状态,可以按组启动或停止该组内所有进程
  3. 主要功能函数列表:
function get_all_process # 返回进程名称列表字符串
function get_all_group # 返回进程组列表字符串
# 返回进程详细信息列表字符串,详细信息包括:运行状态、PID、CPU、MEM、启动时间 注:该函数可以接收一个参数,参数为进程名称
function get_process_info
# 返回进程组内的所有进程名称列表字符串 例子:DB组–>“mysql postgresgql oracle”
function get_all_process_by_group

第二节 脚本的特殊参数

  1. 在linux系统中有很多的特殊符号,他们具有特殊的意义

    • $# 是传给脚本的参数个数
    • $0 是脚本本身的名字
    • $1 是传递给该shell的第一个参数
    • $2 是传递给该shell的第二个参数
    • $@ 是传递给脚本的所有参数的列表
    • $ 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个*
    • $$ 是脚本运行的当前进程ID号
    • $?是显示最后命令退出的状态,0表示没有错误,其他表示有错误
#!/bin/bash
echo "param num:$#"
echo "sh name is :$0"
echo "The first param is :$1"
echo "The second param is :$2"
echo "The all param list is :$@"
echo "The all param str is :$*"
echo "The PID is:$$"
echo "The precomm stat is:$?"

第三节 功能函数的实现

# process.cfg
[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
parameter=-f /root/lesson/9.1/tmp/mysql.conf [postgresql]
description="PG Server"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/postgresql.conf[oracle]
description="The Best DB Server In The World"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/oracle.conf[datanode]
description="NODE: Storage Data For HDFS"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/hdfs-datanode.xml[namenode]
description="NODE: Storage MetaData For HDFS"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/hdfs-namenode.xml[journalnode]
description="Data synchronization For NameNode"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/hdfs-journalnode.xml[resourcemanager]
description="Resource allocation, task scheduling"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/yarn-resourcemanager.xml[nodemanager]
description="Compute nodes to perform tasks assigned by RM"
program_name=tail
parameter=-f /root/lesson/9.1/tmp/yarn-nodemanager.xml
  1. function get_all_group说明:该函数无需输入任何参数;返回配置文件 process.cfg中所有的组信息,例如WEB、DB等。
function  get_all_group
{if [ ! -e $HOME_DIR/$CONFIG_FILE ];thenecho "CONFIG_FILE is not exist .. PLease CHeck.."EXIT 1elseG_LIST=$(sed -n '/\[GROUP_LIST\]/,/\[.*\]/p' process.cfg | egrep -v "(^$|\[.*\])")echo "$G_LIST"fi
}# 测试一下
# groups=`get_all_group`
# echo $groups
# for g in `get_all_group`
# do
#   echo $g
# done
  1. function get_all_process: 说明:该函数无需输入任何参数;返回配置文件 process.cfg中所有的进程信息。
function get_all_process
{for g in `get_all_group`do P_LIST=`sed -n "/\[$g\]/,/\[.*\]/p" process.cfg | egrep -v '^$|\[.*\]'`echo $P_LISTdone
}
  1. function get_process_info

    • function get_process_pid_by_name说明:该函数接收一个参数,参数为进程名称;返回值是一个PID的列表,可能有一个PID,也可能有多个
    • function get_process_info_by_pid说明:该函数接收一个参数,参数为进程PID;返回值是一个进程运行信息的列表,列表包含运行状态、CPU占用率、内存占用率、进程启动时间
    • $@:表示所有脚本参数的内容 $#:表示返回所有脚本参数的个数。
function get_process_pid_by_name
{if [ $# -ne 1 ];thenreturn 1else pids=`ps -ef | grep $1 | grep -v grep | grep -v $0| awk '{print $2}'`echo $pidsfi
}function get_process_info_by_pid
{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`
}
  1. function is_group_in_config说明:该函数接收一个参数,参数为组的名称;返回值是0或1,0代表该组在配置文件中,1代表该组不在配置文件中
function is_group_in_config
{for gn in `get_all_group`;doif [ $gn = $1 ];thenreturnfidoneecho "Group $1 is not in process.cfg"return 1
}
  1. function get_all_process_by_group说明:该函数接收一个参数,参数为组名称;返回值是对应组内的所有进程名称列表
function is_group_in_config
{for gn in `get_all_group`;doif [ $gn = $1 ];thenreturnfidonereturn 1}function get_all_process_by_group
{is_group_in_config $1if [ $? -eq 0 ];thenp_list=`sed -n "/\[$1\]/,/\[.*\]/p" process.cfg | egrep -v "(^$|\[.*\])"`echo $p_listelseecho "GroupName $1 is not in process.cfg"fi}
  1. function get_group_by_process_name说明:该函数接收一个参数,参数是一个进程名称;返回值是一个组名

function get_group_by_process_name
{for gn in `get_all_group`;dofor pn in `get_all_process_by_group $gn`;doif [ $pn == $1 ];thenecho "$gn"fi done  done
}
  1. function format_print说明:该函数接收二个参数,第一个参数为process_name,第二个参数为组名称返回值,是针对每一个进程PID的运行信息
function format_print
{ps -ef | grep $1 | grep -v grep | grep -v $this_pid &> /dev/nullif [ $? -eq 0 ];thenpids=`get_process_pid_by_name $1`for id in $pids;doget_process_info_by_pid $idawk -v p_name=$1 \-v g_name=$2 \-v p_status=$pro_status \-v p_cpu=$pro_cpu \-v p_mem=$pro_mem \-v p_start_time=$pro_start_time 'BEGIN{printf "%-10s%-10s%-5s%-5s%-5s%-5s%-15s\n",p_name,g_name,p_status,p_cpu,p_mem,p_start_time}'doneelseawk -v p_name=$1  -v g_name=$2 'BEGIN{printf "%-10s%-10s%-5s%-5s%-5s%-5s%-15s\n",p_name,g_name,"NULL","NULL","NULL","NULL","NULL"}'fi  }
  1. function is_process_in_config说明:该函数接收一个参数,参数为进程名称;返回值是0或1,0代表该进程在配置文件中,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
}

第四节 程序主流程设计及代码实现

  1. ./app_status.sh 执行有三种情况:

    • 无参数 列出配置文件中所有进程的运行信息
    • -g GroupName 列出GroupName组内的所有进程
    • process_name 列出指定进程的运行信息
  2. shift命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。
if [ ! -e $HOME_DIR/$CONFIG_FILE ];thenecho "CONFIG_FILE is not exist .. PLease CHeck.."exit 1
fiawk 'BEGIN{printf "%-16s%-10s%-10s%-10s%-10s%-10s%-20s\n","ProcessName---","GroupNmae---","Status---","Pid----","Cpu-----","Memory---","StartTime---"}'if [ $# -gt 0 ];thenif [ "$1" == "-g" ];thenshift # 把-g移走for gn in $@;dois_group_in_config $gn || continuefor pn in `get_all_process_by_group $gn`;dois_process_in_config $pn && format_print $pn $gndonedoneelsefor pn in $@;dogn=`get_group_by_process_name $pn`is_process_in_config $pn && format_print $pn $gndonefi
elsefor pn in `get_all_process`;dogn=`get_group_by_process_name $pn`is_process_in_config $pn && format_print $pn $gndone
fi

第七课 Shell脚本编程-大型脚本工具开发实战相关推荐

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

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

  2. 聊聊在博客园写博客的这两年《Unity 3D脚本编程:使用C#语言开发跨平台游戏》正式出版...

    版本状态: 2016.9 第一次印刷 (2016.11 输出到台湾) 2017.1 第二次印刷 2017.5 第三次印刷 2017.5 电子书上线:Unity 3D脚本编程--使用C#语言开发跨平台游 ...

  3. 《Unity 3D脚本编程:使用C#语言开发跨平台游戏》序言

    本文是7月受陈嘉栋的委托为他的新书<Unity 3D脚本编程:使用C#语言开发跨平台游戏>所写的序言,借助序言告诉大家.NET平台有着一个广阔的使用场景. 序言 Unity3D 是由两个具 ...

  4. 第七课 大数据技术之Fink1.13的实战学习-Fink CEP

    第七课 大数据技术之Fink1.13的实战学习-Fink CEP 文章目录 第七课 大数据技术之Fink1.13的实战学习-Fink CEP 第一节 Fink CEP介绍 1.1 Flink CEP背 ...

  5. C#之windows桌面软件第七课:(下集)串口工具实现数据校验、用灯反应设备状态

    C#之windows桌面软件第七课:(下集)串口工具实现数据校验.用灯反应设备状态 using System; using System.Collections.Generic; using Syst ...

  6. python程序设计从基础到开发电子书_Python核心编程从入门到开发实战(pdf+txt+epub+azw3+mobi电子书在线阅读下载)...

    作者:朱红庆 格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT 内容简介: 本书以学会.用好 Python 语言进行软件编程为目标,不仅讲解了基本概念.数据类型.变量.运算符. ...

  7. c语言支持脚本编程,lr脚本编程C语言.docx

    lr脚本编程C语言 1.#define COUNT 100#define SALARY 4000Action(){int total;total=COUNT*SALARY;lr_output_mess ...

  8. 《Unity3d脚本编程 使用C#语言开发跨平台游戏》读书笔记1

    1.4脚本编程的优势 ·易于学习,代码维护方便,适合快速开发 ·开发成本低(因易于学习,所以可以启用新人,同时开发速度快,这些都是降低成本的方法) 2.2.1以速度作为衡量语言级别的标准,那么语言从低 ...

  9. linux内核与bash脚本接囗,Bash脚本编程之脚本基础和bash配置文件

    脚本基础 不严谨地说,编程语言根据代码运行的方式,可以分为两种方式: 编译运行:需要先将人类可识别的代码文件编译成机器可运行的二进制程序文件后,方可运行.例如C语言和Java语言. 解释运行:需要一个 ...

最新文章

  1. Java 2实用教程(第五版)耿祥义 全部课后习题答案
  2. micro-job 0.0.2 发布,分布式任务调度框架
  3. 9.1 ps:查看进程
  4. 2 FI配置-企业结构-定义-创建公司代码(Company Code)
  5. qt如何安装python_安装Python QT,PythonQT,的
  6. python编写的心得_Python开发之我的小心得
  7. 使用Nginx、Keepalived构建负载均衡
  8. win11如何进行bug反馈 windows11进行bug反馈的步骤方法
  9. POJ 1365 Prime Land
  10. 英伟达显卡控制面板没有显示设置的三种解决方法
  11. 国务院:推进电子印章、签名应用,君子签助推高频事项“跨省通办”
  12. yalmip简单的例子
  13. (二)移动 GPU 和桌面 GPU 的差距有哪些?
  14. mysql 段错误 (core dumped)_CentOS yum 段错误 (core dumped)解决办法
  15. Process Hacker 简单介绍
  16. django后台添加学生-jquery实现表单正则表达式验证,判断是否可以进行提交
  17. ACM-ICPC 2018 焦作赛区网络预赛 L. Poor God Water
  18. 如何将白鹭引擎开发的游戏通过Egret Native发布到 GooglePlay平台
  19. html 文本标签 不换行,css如何强制不允许换行?
  20. 『前端实习笔记』前言 坎坷的找实习之路

热门文章

  1. 计算机程序员职业发展路径,IT程序员未来职业发展3大路线图(全)
  2. jupyter notebook 添加核 (jupyter:ModuleNotFoundError: No module named ‘torch‘) 亲测可用
  3. 微信公众号h5支付完后无返回值,整个h5页面被关闭
  4. 开源BI报表及OLAP多维分析平台OPENI(二)—搭建Eclipse下的Openi开发环境
  5. jsp教学网站百度文库_动态网站技术(JSP)教学大纲
  6. Helm系列(5)-helm 常用命令
  7. 'gulp'不是内部或者外部命令,也不是可运行的程序或批处理文件,解决办法
  8. php日期函数 英文日期,PHP 日期与时间函数
  9. C++ 一维数组实现杨辉三角(Pascar Triangel)
  10. Normalization Methods