查看“Python自动发现Jar包以及CPU利用率”的源代码
←
Python自动发现Jar包以及CPU利用率
跳转至:
导航
,
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
== Python自动发现Jar包和CPU使用率 == 在我们日常运维中,云服务器跑了一些java程序,服务器CPU利用率,系统负载就突然升高了,对于这一系列问题,阿里云或者华为云,他们会发短信提醒你,此刻的云服务器异常了,需要我们去检查,或者使用Zabbix或者Prometheus等第三方监控。 '''Zabbix自动发现原理''' 通过读Zabbix的官网知道,Zabbix的自动发现有两种类型,同时也对应了两种不同的操作仿法,第一个是自动发现。另外-个是低级别的自动发现(low-level discovery )。 两者的区别如下: 低级别发现(low-level discovery )自动发现一个监控主机(host)下同-类的监控项(如磁盘、网卡等), 并添加为监控项;而自动发现是指Zabbix通过特定的规则(如端口,SNMP等),发现网络中符合该规则的监控主机, 并添加到Zabbix中。 自动发现(discovery ):原理是按照特定的规则去发现网络上的监控主机,如FTP服务器-般使用21端口, Tomcat的端口-般为8080,所有的监控主机都可以被Zabbix功能ping通等。自动发现的前提是标准化,对于使用个性化配置的监控主机,不适合用自动发现功能。 '''我们使用Python jar.list的键值代码实现''' 我们先假设我们的服务器上的java程序名称格式都是"xxx-1 .0.0.jar'",结尾,那么我们的Python代码怎么去实现找出所有符合规则的jar应用出来呢? '''(由于教程上的代码是检测jar包,但是目前云服务器上没有启动的jar包所以检测不到任何程序,为了达到实验效果,可以更改为当前系统存在的程序比如:cnpm)''' 代码如下jar.py: # coding:utf-8 import subprocess import argparse import os """ python jar.py -list "test" """ try: import json except ImportError: import simplejson as json def jarList(): command = "ps -ef |grep java|grep -v grep|grep '1.0.0.jar'|awk '{print $NF}'" p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) port_list = p.stdout.read().split('\n') port = [] for i in port_list: if len(i) != 0: port += [{'{#JAVAPSS}': i}] print(json.dumps({'data': port}, sort_keys=True, indent=4, separators=(',', ':'))) ## parser = argparse.ArgumentParser() parser.add_argument("-l","--list", help="list jar process") args = parser.parse_args() if args.list: jarList() [[文件:2020-08-08_212918.png]] 运行结果为: { "data":[ { "{#JAVAPSS}":"report-1.0.0.jar" } ] } [[文件:2020-08-08_212737.png]] 代码解析: 10-13行,导入json模块,于后续的格式化输出<br> 16-24行,定义jarList的函数,用于把所有的jar包列出来。其中列出jar包的原理是<br> 通过调用系统shell的ps命令进行实现的。shell命令执行如下:<br> [[文件:Https---c-ssl.duitang.com-uploads-item-201511-07-20151107191711 H5LwP.png]] json.dumps用于格式化输出28-30行,使佣argparse模块,于给用户编写友好的命令行接口。定义命令行传入的参数为--list:<br> 32-33,当传入的命令行参数为- - list的时候,会执行列出jar包命令名称的函数jarlist。<br> 通过上面的代码我们已经实现了jar. list的键值的输出内容。前只是能够显示所有的jar命令。<br> '''接下来我们实现CPU的利用率 jar.cpu[*]的键值实现''' '''(代码目的是计算每个jar包的cpu使用率,我们云服务器环境没有正在运行的jar包,所以为了达到实验效果更换为其他应用程序)'''<br> 如果要得到每个jar的CPU使用率,我们首先要把jar名称传进来才行,实现代码如下: # coding:utf-8 import subprocess import argparse import os """ python jar.py -list "test" """ try: import json except ImportError: import simplejson as json def jarList(): command = "ps -ef |grep java|grep -v grep|grep '1.0.0.jar'|awk '{print $NF}'" p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) port_list = p.stdout.read().split('\n') port = [] for i in port_list: if len(i) != 0: port += [{'{#JAVAPSS}': i}] print(json.dumps({'data': port}, sort_keys=True, indent=4, separators=(',', ':'))) ##获取对应的jar包的pid值 def getpid(name): pid=os.popen("ps -ef | grep {0}|grep -v grep".format(name)).readlines()[0].split()[1] return pid def cpuinfo(pid): command = "ps -p {0} -o pcpu".format(pid) p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) xx=p.stdout.read().split('\n') res=int(float(xx[1])) print(res) return res ### parser = argparse.ArgumentParser() parser.add_argument("-l","--list", help="list jar process") parser.add_argument("-n","--name", help="java name") parser.add_argument("-c","--cpu", help="count for cpu value") args = parser.parse_args() if args.list: jarList() elif args.name and args.cpu == "cpu": cpuinfo(getpid(args.name)) 代码执行结果: [[文件:2020-08-08 223934.png]] 在linux中执行命令实现效果如下(查找程序的Pid值,通过Pid值查看CPU使用率):<br> [[文件:2020-08-08 223410.png]] 代码解析: 28-30行,义getpid 函数,并使用jar包名作为参数传入,于获取对应的jar包的pid名字,原理也是通过调用ps命令实现。
返回至
Python自动发现Jar包以及CPU利用率
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息