python使用自制程序_python--自制程序性能检测工具
需求:做一个小工具,用来检测某一个程序的异常崩溃,cpu专用率,内存使用率,线程数,线程是否阻塞问题,当出现上述异常时,将日志上传服务器,方便查找问题。
这样一个小程序实现起来并不太难,但是我一点python都不会,可真是。。。时间只有一个星期。所以用一天的时间看了python的语法,第二天开始入手写一些小函数,第三天写业务逻辑,第四天调bug,第五天将这个小程序融入项目。终于实现了功能,但是代码却并不是什么高质量的代码,只是匆忙堆砌起来的。下面记录一下。
在这个代码中使用到了paramiko库,需要自行下载编译库,使用paramiko库的目的是为了实现使用sftp进行文件的上传服务器。
具体操作可以参考:
其中遇到一个SFTP IOError的错误,查了半天是我的iP输入错了,在这里的操作一定要捕获异常,不然程序会奔溃,在python里面,捕获异常尤其重要,不然程序真的会在你意想不到的地方,随意奔溃。
程序运行平台为centos7.5
主程序如下:
#!/usr/bin/python
#-*- coding:UTF-8 -*-
#文件名:autoCheck.py
import commands
import time
import datetime
import os
import paramiko
import pdb
import signal
import platform
LogNameList=('httpdkey','message','info','warning')
InstallFileFlag='/etc/tlx/config'
InstallStartFlag=0
def getProcessInfo(processName):
'''input:进程名称
output:某一进程的pid,cpu占用率,mem占用率'''
cmd = 'ps aux | grep %s | grep -v grep |\
grep -v "sudo" | awk \'{print $2,$3,$4}\''%(processName)
(status,output) = commands.getstatusoutput(cmd)
print status,output
if status == 0 and len(output) > 0:
return output;
else:
return None;
def getProcessMem(inputData):
inputList = inputData.split(' ')
mem = inputList[2]
memVal = float(mem)
return memVal;
def getProcessPid(inputData):
inputList = inputData.split(' ')
pid = inputList[0]
# pidVal = float(pid)
return pid;
def getProcessCpu(inputData):
inputList = inputData.split(' ')
cpu = inputList[1]
cpuVal = float(cpu)
return cpuVal;
def getProcessThreadNum(pidNum):
cmd = 'ps -T -p %s' %(pidNum)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
outputList = output.split('\n')
threadNum = len(outputList)
return threadNum;
else:
return 0;
def getProcessOpenFdNum(fileName):
cmd = 'lsof -c %s' %(fileName)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
outputList = output.split('\n')
threadNum = len(outputList)
return threadNum;
else:
return 0;
def getProcessOpenSocketNum(socketName):
cmd = 'netstat -nltp | grep %s' %(socketName)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
outputList = output.split('\n')
threadNum = len(outputList)
return threadNum;
else:
return 0;
def checkPortOccupy(portNum):
cmd = 'netstat -nltp | grep %s' %(portNum)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
return 1;
else:
return 0;
def getLogUpdateTime():
global LogNameList
cmd = 'ls -l /var/log/tlx'
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
outputList = output.split('\n')
counts = len(outputList)
for index in range(len(outputList)):
dataLine = outputList[index]
print 'dataLine:%s'%(dataLine)
fileTime = getFileModifirendTime(dataLine)
if fileTime == None:
continue;
currTime = getCurrentTime()
if compareTimeStr(currTime,fileTime) == 1:
for index in range(len(LogNameList)):
if LogNameList[index] is dataLine.split()[-1]:
print 'log:%s'%(LogNameList[index])
return LogNameList[index];
else:
return None;
def getFileModifirendTime(fileInfo):
'''使用ll命令得到如下格式命令:
-rwxr-xr-x. 1 root root 3888 Mar 20 10:31 autoCheck.py'''
cmd = 'echo ' +fileInfo+ ' | awk \'{print $8}\''
(status,output) = commands.getstatusoutput(cmd)
#print 'status:%s,output:%s,len:%s'%(status,output,len(output))
if (status == 0) and (len(output) > 0):
return output;
else:
return None;
def getCurrentTime():
'得到如下格式的时间:Sat Mar 28 22:24:24 2016'
time_tmp = time.strftime('%a %b %d %H:%M:%S %Y', time.localtime())
return time_tmp;
def compareTimeStr(currTime,fileTime):
'将getFileModifirendTime函数得到的时间拼装完整,进行时间比较'
timestr1_tmp = time.mktime(time.strptime(currTime,\
"%a %b %d %H:%M:%S %Y"))
curTimeQ = currTime.split(" ")
fileTimeQ = curTimeQ[0] + ' ' + curTimeQ[1] + ' ' +\
curTimeQ[2] + ' ' + fileTime + ':00 ' + curTimeQ[4]
timestr2_tmp = time.mktime(time.strptime(fileTimeQ,\
"%a %b %d %H:%M:%S %Y"))
if (timestr1_tmp - timestr2_tmp) > 300:
print 'timestr1_curr:%d > timestr2_file:%d'%(timestr1_tmp,timestr2_tmp)
return 1;
else:
return 0;
def recordCmdInfo(processName):
fdData=''
cmd = 'ps aux | grep %s | grep -v grep'%(processName)
(status,output) = commands.getstatusoutput(cmd)
print status,output
if status == 0 and len(output) > 0:
fdData += output
fdData += '\r'
cmd = 'ps -T -p %s' %(pidNum)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
fdData += output
fdData += '\r'
cmd = 'lsof -c %s' %(fileName)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
fdData += output
fdData += '\r'
fd = open('/var/log/tlx/tlx_syslog','a+')
fd.write(fdData)
fd.close()
def getServerIp(ipFile):
fd = open(ipFile,'r')
fdData = fd.readline()
ipList = fdData.split('=')
ip = ipList[1].rstrip()
return ip;
def sftpUploadFile(localFileName,serverFileName):
global InstallFileFlag
t = paramiko.Transport((getServerIp(InstallFileFlag),22))
t.connect(username='admin',password='admin123')
sftp = paramiko.SFTPClient.from_transport(t)
try:
sftp.put(localFileName,serverFileName)
except IOError:
t.close()
else:
t.close()
def packageLog():
exeFlag = 0
packageName = 'tlx_' + time.strftime('%m_%d_%H_%M',time.localtime()) + '.tar.gz'
localFile = '/var/log/%s'%(packageName)
serverFile = '/srv/ftp/%s'%(packageName)
print 'localFile:%s,serverFile:%s'%(localFile,serverFile)
cmd = 'tar -zcvf %s /var/log/tlx'%(localFile)
(status,output) = commands.getstatusoutput(cmd)
if status == 0 and len(output) > 0:
time.sleep(1)
sftpUploadFile(localFile,serverFile)
exeFlag = 1
restartServer()
def restartServer():
processData = getProcessInfo('process')
if processData == None:
while checkPortOccupy('10001'):
print '10001 port occupy'
cmd = '/opt/tlx/process/process'
(status,output) = commands.getstatusoutput(cmd)
if status == 0:
print 'process restart'
else:
print 'process restart failed'
else:
processPid = getProcessPid(processData)
cmd = 'kill -9 %s' %(processPid)
(status,output) = commands.getstatusoutput(cmd)
if status == 0:
print 'process stop'
while checkPortOccupy('10001'):
print '10001 port occupy'
time.sleep(2)
cmd = '/opt/tlx/process/process'
(status,output) = commands.getstatusoutput(cmd)
if status == 0:
print 'process restart'
else:
print 'process restart failed'
def shutdownFunct(signalnum,frame):
pass
def signalCapture():
global InstallStartFlag
try:
for sig in [signal.SIGINT,signal.SIGHUP,signal.SIGTERM,signal.SIGKILL]:
signal.signal(sig,shutdownFunct)
InstallStartFlag = 0
continue;
except RuntimeError:
return;
InstallStartFlag = 0
print '将文件,相关数据打包,上传'
packageLog()
def enviromentCheck():
cmd = './environment.sh'
(status,output) = commands.getstatusoutput(cmd)
if status != 0:
print '环境安装错误,请检查paramiko-1.7.5 pycrypto-2.6模块的安装'
exit()
def sysDistinguish():
sysInfo = platform.platform()
# if -1 != sysInfo.find('Ubuntu'):
# else if -1 != sysInfo.find('CentOS'):
def running():
print 'process start...'
global InstallFileFlag
global InstallStartFlag
# enviromentCheck()
while 1:
time.sleep(1)
errorFlag = 0
if not os.access(InstallFileFlag,os.F_OK):
continue;
processData = getProcessInfo('process')
if processData == None:
if InstallStartFlag == 0:
continue;
else:
signalCapture()
continue;
InstallStartFlag = 1
if getProcessCpu(processData) > 50:
errorFlag = 1
if getProcessMem(processData) > 10:
errorFlag = 1
processPid = getProcessPid(processData)
if getProcessThreadNum(processPid) > 10:
errorFlag = 1
if getProcessOpenFdNum('process') > 100:
errorFlag = 1
logFileName = getLogUpdateTime()
if logFileName:
errorFlag = 1
if errorFlag == 1:
'''出现错误的话,则将上述几项内容进行记录,
然后将相关日志进行打包,上传服务器,将程序杀死,再启动'''
packageLog()
#running()
#pdb.run('running()')
if __name__ == "__main__":
running()
在编写程序过程中,需要调试程序,所以又查看了python的程序调试方法,比较好用的就是pdb了,常用的是打日志进行调试,在本段代码中,没有写日志的接口,需要后续进行添加。
在linux中使用过gdb的朋友,使用pdb调试起来还是很顺手的。而且我的编译器使用的是vim。
代码调试好,就是对python程序进行打包。网上说了很对打包的原因,我反正使用不到,我打包就是为了解决依赖,然后和现有的程序独立开来,这样才能监控的另一个程序,不会收到干扰。打包使用的pyinstaller工具,安装这个工具的时候,有以下几个步骤:
1.安装python-pip
2.安装:pyinstaller
打包成功后,发现运行打包文件,会出现两个同名的进程,pid是不一样的,很是不解,这让使用linux的不可接受,一直以为是程序哪里出现问题了,使用python XXX执行程序就是正常的一个进程。经过一番查找,终于获得解释,释然
到此为止,整个小工具初步实现功能,算是初步完成。但是和我的预想是不一样的,之后我会再改进一版,将其做成接口类,加入log日志,方便调用排错,增加其通用性。
敬请期待。。。
python使用自制程序_python--自制程序性能检测工具相关推荐
- 纯电动汽车动力性经济性开发程序 Matlab AppDesigner 汽车性能开发工具 电动汽车动力性计算 电动汽车动力总成匹配
纯电动汽车动力性经济性开发程序 Matlab AppDesigner 汽车性能开发工具 电动汽车动力性计算 电动汽车动力总成匹配 写在前面:汽车动力性经济性仿真常用的仿真工具有AVL Cruise.a ...
- [安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息]
[安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息] 软件名称:HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息] 软件大小:1.74 MB 软件类型:国产软 ...
- coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...
FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具 摘要 性能测试的一个目标是找出某些特定情况,在这些情况下对于某些输入值组合,应用程序意外地展示出更糟糕的特性.性能测试的一个基本问题是如何 ...
- 在debug模式下引入一些性能检测工具
我们经常在debug模式下使用一些性能检测工具,例如blockCannary,leakCannary.Stetho等,但是我们release的时候又不需要这些检测工具,通常情况下我们的做法是在buil ...
- 如何使用Lighthouse性能检测工具
前言 最近做性能检测工具,很多知识点不清楚,打算查缺补漏,补一补. 接下来从官方提供的性能检测工具Lighthouse(灯塔)开始我们的学习,简单介绍了下Lighthouse的一些点. 阅读完本文,你 ...
- [Linux 性能检测工具]IOSTAT
[Linux 性能检测工具]IOSTAT IOSTAT NAME: Iostat, 报告CPU的统计,和 I/O的统计. 语法: iostat [ -c ] [ -d ] [ -N ...
- [Linux 性能检测工具]DF
[Linux 性能检测工具]DF DF NAME: df 报告了文件系统的使用 语法: df [OPTION]... [FILE]... 描述: Df显示了以文件名为从参数查看所在文件系统的可用空间. ...
- Unity官方性能检测工具UPR使用心得
Unity官方性能检测工具UPR使用心得 UPR是Unity官方推出的免费性能检测工具,近来功能较之前版本完善了许多,经笔者在正式项目中试用,与UWA的免费性能检测工具GPM作对比,发现UPR相较GP ...
- 季冠CPM云平台监控系统——自动化链路的性能检测工具
网络监测 自动化 智能化 在互联网高度发展的今天,我们每一个人都有过被网络支配的恐惧,除了手机没电,最害怕的就是网络卡顿和网络延迟. 尤其是对于线下实体门店.互联网公司.工厂及酒店等多分支网点企业来说 ...
- Unity性能优化之性能检测工具汇总
Unity Profiler 简述:Unity自带的性能分析工具,可以分析CPU.GPU以及内存消耗,支持真机调试. 官方教程:https://docs.unity3d.com/Manual/Prof ...
最新文章
- 了解一下:机器学习性能优化的6个指标
- error while loading shared libraries: libz.so.1错误
- java使用strlen_java – “strlen(s1) – strlen(s2)”永远不会小于零
- Appium+Python3 并发启动测试设备
- linux下intel无线网卡安装失败,ubuntu 16.04无法安装无线网卡驱动
- hp服务器安装win7普通系统安装,hp台式电脑安装系统一键安装win7系统
- python string length_自学Python:第四篇字符串
- hex2bin 64bit
- PS新手淘宝美工常见问题-主图和详情尺寸(一)
- linux c写的一个航班查询的程序
- java spi 扩展_【扩展和解耦】JAVA原生SPI实现插件扩展
- java实现蒲丰投针求_蒲丰投针问题
- 长连接心跳问题解决总结
- POE 供电设备原理详解
- GPS ublox配置过程
- 思博伦TestCenter Virtual上线AWS Marketplace, 可简化公有云和混合云测试
- 【Nginx】第二十二节 redirect跟permanent区别
- ListView里面的自定义控件
- 面试题:如何验证指标结果准确?
- Python中实现“一行拆多行“和“多行并一行“,你会吗?