首页 > 系统相关 >(转)第七课 Shell脚本编程-大型脚本工具开发实战

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

时间:2022-12-01 22:35:51浏览次数:59  
标签:脚本 Shell group name get 第七课 echo process 进程

原文:https://blog.csdn.net/aa18855953229/article/details/127380188

第一节 需求描述
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
需求描述
实现一个脚本工具,该脚本提供类似supervisor功能,可以对进程进行管理;
一键查看所有进程运行状态
单个或批量启动进程,单个或批量停止进程
提供进程分组功能,可以按组查看进行运行状态,可以按组启动或停止该组内所有进程
主要功能函数列表:
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
2
3
4
5
6
第二节 脚本的特殊参数
在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:$?"
1
2
3
4
5
6
7
8
9
第三节 功能函数的实现
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
function get_all_group说明:该函数无需输入任何参数;返回配置文件 process.cfg中所有的组信息,例如WEB、DB等。
function get_all_group
{
if [ ! -e $HOME_DIR/$CONFIG_FILE ];then
echo "CONFIG_FILE is not exist .. PLease CHeck.."
EXIT 1
else
G_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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_LIST
done
}
1
2
3
4
5
6
7
8
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 ];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`
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function is_group_in_config说明:该函数接收一个参数,参数为组的名称;返回值是0或1,0代表该组在配置文件中,1代表该组不在配置文件中
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
}
1
2
3
4
5
6
7
8
9
10
function get_all_process_by_group说明:该函数接收一个参数,参数为组名称;返回值是对应组内的所有进程名称列表
function is_group_in_config
{
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" process.cfg | egrep -v "(^$|\[.*\])"`
echo $p_list
else
echo "GroupName $1 is not in process.cfg"
fi

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function get_group_by_process_name说明:该函数接收一个参数,参数是一个进程名称;返回值是一个组名

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
}
1
2
3
4
5
6
7
8
9
10
11
function format_print说明:该函数接收二个参数,第一个参数为process_name,第二个参数为组名称返回值,是针对每一个进程PID的运行信息
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`
for id in $pids;do
get_process_info_by_pid $id
awk -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}'
done
else
awk -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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function is_process_in_config说明:该函数接收一个参数,参数为进程名称;返回值是0或1,0代表该进程在配置文件中,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
}
1
2
3
4
5
6
7
8
9
10
第四节 程序主流程设计及代码实现
./app_status.sh 执行有三种情况:
无参数 列出配置文件中所有进程的运行信息
-g GroupName 列出GroupName组内的所有进程
process_name 列出指定进程的运行信息
shift命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。
if [ ! -e $HOME_DIR/$CONFIG_FILE ];then
echo "CONFIG_FILE is not exist .. PLease CHeck.."
exit 1
fi


awk 'BEGIN{printf "%-16s%-10s%-10s%-10s%-10s%-10s%-20s\n","ProcessName---","GroupNmae---","Status---","Pid----","Cpu-----","Memory---","StartTime---"}'


if [ $# -gt 0 ];then
if [ "$1" == "-g" ];then
shift # 把-g移走
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
————————————————
版权声明:本文为CSDN博主「道教儒佛电磁波」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aa18855953229/article/details/127380188

标签:脚本,Shell,group,name,get,第七课,echo,process,进程
From: https://www.cnblogs.com/liujiacai/p/16942991.html

相关文章

  • Windows命令行command的Shell命令详细解析和语法
    CMD命令大全及详细解释和语法CMD命令大全及详细解释和语法MicrosoftWindowsXP[版本5.1.2600]有关某个命令的详细信息,请键入HELP命令名ASSOC   显示或修改文......
  • Shell脚本编程笔记
    笔记来源菜鸟教程——Shell教程https://www.runoob.com/linux/linux-shell.html侵删什么是Shell?Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面......
  • iNeuOS工业互联网操作系统,脚本化实现设备运行时长和效率计算与统计
    目      录1.     概述...22.     实时采集开停状态...23.     增加虚拟设备...24.     脚本统计和计算设备运行时长...45.  ......
  • Notion导出批量更改脚本
    0.缘起问就是和Notion分手后的阵痛导出会有很多乱码,我忍受了一段时间终于忍不了了,掏出学了一点点的python,写了个脚本。该脚本就是检测到当前文件OR文件夹名称中含有.,......
  • 拼多多 autojs脚本
    functionFreeRestriction(){  importClass(com.stardust.autojs.core.accessibility.AccessibilityBridge.WindowFilter);  letbridge=runtime.accessibili......
  • 使用批处理扫描局域网内存活的主机的脚本
    1、先在电脑任意位置下新建一个txt的文本,然后命名为“扫描局域网内存活的主机.bat”的bat文件。  2、右键该文件,选择"编辑",把以下内容复制进去,最后保存。 @echooff......
  • 不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )
    在“程序包管理器控制台”使用命令“update-database”会提示:TheEntityFrameworkCorePackageManagerConsoleToolsdon'tsupportPowerShellversion2.0.Upgradet......
  • VScode设置NPM脚本窗口
    在资源管理器里有多个窗口,比如:打开的编辑器、文件夹、npm脚本、大纲,可以很快捷的查看和操作一些功能。最近vscode突然升级更新,然后打开项目就出现如上图窗台,缺少打开的编辑......
  • springboot 项目自动重启脚本及注册方式
    创建脚本文件/etc/init.d/prs_xml.jar 添加脚本chkconfig-add prs_xml.jar查看服务列表chkconfig--list 启动服务chkconfigprs_xml.jaron设置启动等级chk......
  • shell linux环境下内存压测
    目录shelllinux环境下内存压测脚本详情用法shelllinux环境下内存压测公司在测试prometheus检测node节点内存,但是不允许修改prometheus的阈值,只能用脚本模拟内存增加来......