需求:做一个小工具,用来检测某一个程序的异常崩溃,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--自制程序性能检测工具相关推荐

  1. 纯电动汽车动力性经济性开发程序 Matlab AppDesigner 汽车性能开发工具 电动汽车动力性计算 电动汽车动力总成匹配

    纯电动汽车动力性经济性开发程序 Matlab AppDesigner 汽车性能开发工具 电动汽车动力性计算 电动汽车动力总成匹配 写在前面:汽车动力性经济性仿真常用的仿真工具有AVL Cruise.a ...

  2. [安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息]

    [安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息] 软件名称:HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息] 软件大小:1.74 MB 软件类型:国产软 ...

  3. coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...

    FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具 摘要 性能测试的一个目标是找出某些特定情况,在这些情况下对于某些输入值组合,应用程序意外地展示出更糟糕的特性.性能测试的一个基本问题是如何 ...

  4. 在debug模式下引入一些性能检测工具

    我们经常在debug模式下使用一些性能检测工具,例如blockCannary,leakCannary.Stetho等,但是我们release的时候又不需要这些检测工具,通常情况下我们的做法是在buil ...

  5. 如何使用Lighthouse性能检测工具

    前言 最近做性能检测工具,很多知识点不清楚,打算查缺补漏,补一补. 接下来从官方提供的性能检测工具Lighthouse(灯塔)开始我们的学习,简单介绍了下Lighthouse的一些点. 阅读完本文,你 ...

  6. [Linux 性能检测工具]IOSTAT

    [Linux 性能检测工具]IOSTAT IOSTAT NAME:          Iostat, 报告CPU的统计,和 I/O的统计. 语法: iostat  [ -c ] [ -d ] [ -N ...

  7. [Linux 性能检测工具]DF

    [Linux 性能检测工具]DF DF NAME: df 报告了文件系统的使用 语法: df [OPTION]... [FILE]... 描述: Df显示了以文件名为从参数查看所在文件系统的可用空间. ...

  8. Unity官方性能检测工具UPR使用心得

    Unity官方性能检测工具UPR使用心得 UPR是Unity官方推出的免费性能检测工具,近来功能较之前版本完善了许多,经笔者在正式项目中试用,与UWA的免费性能检测工具GPM作对比,发现UPR相较GP ...

  9. 季冠CPM云平台监控系统——自动化链路的性能检测工具

    网络监测 自动化 智能化 在互联网高度发展的今天,我们每一个人都有过被网络支配的恐惧,除了手机没电,最害怕的就是网络卡顿和网络延迟. 尤其是对于线下实体门店.互联网公司.工厂及酒店等多分支网点企业来说 ...

  10. Unity性能优化之性能检测工具汇总

    Unity Profiler 简述:Unity自带的性能分析工具,可以分析CPU.GPU以及内存消耗,支持真机调试. 官方教程:https://docs.unity3d.com/Manual/Prof ...

最新文章

  1. 了解一下:机器学习性能优化的6个指标
  2. error while loading shared libraries: libz.so.1错误
  3. java使用strlen_java – “strlen(s1) – strlen(s2)”永远不会小于零
  4. Appium+Python3 并发启动测试设备
  5. linux下intel无线网卡安装失败,ubuntu 16.04无法安装无线网卡驱动
  6. hp服务器安装win7普通系统安装,hp台式电脑安装系统一键安装win7系统
  7. python string length_自学Python:第四篇字符串
  8. hex2bin 64bit
  9. PS新手淘宝美工常见问题-主图和详情尺寸(一)
  10. linux c写的一个航班查询的程序
  11. java spi 扩展_【扩展和解耦】JAVA原生SPI实现插件扩展
  12. java实现蒲丰投针求_蒲丰投针问题
  13. 长连接心跳问题解决总结
  14. POE 供电设备原理详解
  15. GPS ublox配置过程
  16. 思博伦TestCenter Virtual上线AWS Marketplace, 可简化公有云和混合云测试
  17. 【Nginx】第二十二节 redirect跟permanent区别
  18. ListView里面的自定义控件
  19. 面试题:如何验证指标结果准确?
  20. Python中实现“一行拆多行“和“多行并一行“,你会吗?

热门文章

  1. PPG信号滤波过后的时频分析
  2. 逆天!百度AI音箱重磅升级:最大梦想实现
  3. iOS NSUserDefaults 存放位置
  4. C++中static关键字用法详解
  5. 混合开启服务-----百度音乐盒
  6. Oculus:自己做内容不是长远之计,资助第三方开发者才是王道
  7. 最热web前端技术精粹
  8. hadoop+lucene+web 综合小demo
  9. iphone 开发内存管理 心得
  10. SSAS中出现“对象引用未被设置到对象实例”的解决记录