linux下监控某进程的详细信息并持续写入xml中(python)

linux下监控某进程的详细信息并持续写入xml中(python)

[复制链接]
  
跳转到指定楼层
1#
发表于 6 天前 | 只看该作者 回帖奖励
1.程序采用了xml.dom和xml.etree.ElementTree等模块     
2、该脚本实现监控cpu进程的功能,并把监控的结果放入xml文件中。     
3、获取cpu信息分别采用了psutil库和读取io文件的方法。     
4、当输出xml文件的时候首先判断此文件是否存在,如果存在尽心追加,也就是addWriteXml函数的功能。
5、程序默然情况下是5分钟写一次数据,也可以让用户通过第二个参数进行自定义,同时当用户输入-h的时候显示帮助信息。

   1. # -*- coding:utf-8 -*-
   2.

   3. import os,time
   4.

   5. import sys
   6.

   7. import psutil
   8.

   9. import codecs
  10.

  11. from xml.dom import *
  12.

  13. import xml.dom.minidom as minidom
  14.

  15. import xml.etree.ElementTree as ET
  16.

  17.


  18.



  19. class CreateCovXml():  #创建xml的类
  20.

  21.      def __init__(self,cov_xml_path):
  22.

  23.          self.__cov_path=cov_xml_path
  24.

  25.          self.__dom=None
  26.

  27.          self.__root=None
  28.

  29.      def _covert_code(self, msg):  
  30.

  31.         return msg  
  32.

  33.      
  34.

  35.      def __create_new_node(self, node_name, node_text = None):   #创建节点      
  36.

  37.         if self.__dom == None:  
  38.

  39.             raise Exception,'error'
  40.

  41.         if None == node_text:  
  42.

  43.             return self.__dom.createElement(self._covert_code(node_name))  
  44.

  45.         else:  
  46.

  47.             newNode = self.__dom.createElement(self._covert_code(node_name))  
  48.

  49.             newText = self.__dom.createTextNode(self._covert_code(node_text))  
  50.

  51.             newNode.appendChild(newText)  
  52.

  53.             return newNode  
  54.

  55.               
  56.

  57.      def begin_cov(self):  
  58.

  59.         try:  
  60.

  61.             impl = minidom.getDOMImplementation()  
  62.

  63.             self.__dom = impl.createDocument(None, u'coverages', None)  
  64.

  65.             self.__root = self.__dom.documentElement  
  66.

  67.         except:  
  68.

  69.             traceback.print_exc()  
  70.

  71.             raise Exception  
  72.

  73.         
  74.

  75.      def add_cov(self, name, pid, rms, vms, cpu, rchar,wchar,read_bytes,write_bytes,pid_tim):  
  76.

  77.         if self.__root == None:  
  78.

  79.             raise Exception
  80.

  81.         
  82.

  83.         name_node = self.__create_new_node("Name", name)  
  84.

  85.         pid_node = self.__create_new_node("Pid", pid)  
  86.

  87.         rms_line_node = self.__create_new_node("Rms", rms)  
  88.

  89.         vms_line_node = self.__create_new_node("Vms", vms)  
  90.

  91.         cpu_line_node = self.__create_new_node("Cpu", cpu)  
  92.

  93.         cover_line_node = self.__create_new_node("Rchar", rchar)
  94.

  95.         cover_wchar= self.__create_new_node("Wchar", wchar)
  96.

  97.         cover_read_bytes = self.__create_new_node("Read_bytes", read_bytes)
  98.

  99.         cover_write_bytes = self.__create_new_node("Write_bytes", write_bytes)
100.

101.         nopid_time= self.__create_new_node("Time", pid_tim)
102.

103.         new_coverage_node = self.__create_new_node("ProcessInfo")  
104.

105.         
106.

107.         new_coverage_node.appendChild(name_node)  
108.

109.         new_coverage_node.appendChild(pid_node)  
110.

111.         new_coverage_node.appendChild(rms_line_node)  
112.

113.         new_coverage_node.appendChild(vms_line_node)  
114.

115.         new_coverage_node.appendChild(cpu_line_node)  
116.

117.         new_coverage_node.appendChild(cover_line_node)  
118.

119.         new_coverage_node.appendChild(cover_wchar)
120.

121.         new_coverage_node.appendChild(cover_read_bytes)
122.

123.         new_coverage_node.appendChild(cover_write_bytes)
124.

125.         new_coverage_node.appendChild(nopid_time)
126.

127.         self.__root.appendChild(new_coverage_node)  
128.

129.      
130.

131.      def end_cov(self):  
132.

133.         try:  
134.

135.             f = open(self.__cov_path, 'wb')  
136.

137.             writer = codecs.lookup('utf-8')[3](f)  
138.

139.             self.__dom.writexml(writer, encoding='utf-8')   
140.

141.             writer.close()  
142.

143.             f.close()  
144.

145.             return True  
146.

147.         except Exception, err:  
148.

149.             traceback.print_exc()   
150.

151.             raise Exception
152.

153. def getProcessInfo(p): #得到进程的 pid rms vms等信息
154.

155.     try:
156.

157.         cpu=int(p.get_cpu_percent(interval=0))
158.

159.         rms, vms = p.get_memory_info()
160.

161.         name = p.name
162.

163.         pid = p.pid
164.

165.     except psutil.error.NoSuchProcess, e:
166.

167.         name ="error not get name"
168.

169.         pid = 0
170.

171.         rms = 0
172.

173.         vms = 0
174.

175.         cpu = 0
176.

177.     return [name.upper(),pid,rms,vms,cpu]
178.

179.


180.



181. def getProcessIo(pid): #得到进程的io信息
182.

183.         f=open('/proc/%d/io'% pid)
184.

185.         a=[]
186.

187.         lines=f.readlines()
188.

189.         for line in lines:
190.

191.              m=line.rstrip().split(':')
192.

193.              a.append(m[1])
194.

195.         f.close()
196.

197.         return a
198.

199.


200.



201. def shuchu(input,ti=5*60):
202.

203.     id=[]
204.

205.     for p in psutil.process_iter():
206.

207.         if p.name.upper()==input.upper():
208.

209.            id.append(p.pid)
210.

211.     if os.path.isfile('/tmp/cpu2.xml')==False:
212.

213.           test = CreateCovXml('/tmp/cpu2.xml')
214.

215.           test.begin_cov()
216.

217.           while True:
218.

219.               for p in psutil.process_iter():
220.

221.                     if p.name.upper()==input.upper():
222.

223.                          id.append(p.pid)
224.

225.               for i in id:
226.

227.                    p=psutil.Process(i)
228.

229.                    prcIo=getProcessIo(i)
230.

231.                    prcInf=getProcessInfo(p)
232.

233.                    s=time.strftime('%Y-%m-%d %H-%M-%S',time.localtime(time.time()))
234.

235.                    test.add_cov(  
236.

237.                         name = prcInf[0],  
238.

239.                         pid = str(prcInf[1]),                    
240.

241.                         rms = str(prcInf[2]),
242.

243.                         vms= str(prcInf[3]),
244.

245.                         cpu = str(prcInf[4]),
246.

247.                         rchar=str(prcIo[0]),
248.

249.                         wchar=str(prcIo[1]),
250.

251.                         read_bytes=str(prcIo[4]),
252.

253.                         write_bytes=str(prcIo[5]),
254.

255.                         pid_tim = s
256.

257.                        )
258.

259.               time.sleep(ti)  
260.

261.               test.end_cov()
262.

263.            #print 'endl'
264.

265.     else:
266.

267.         while True:
268.

269.              for p in psutil.process_iter():
270.

271.                  if p.name.upper()==input.upper():
272.

273.                       id.append(p.pid)
274.

275.              for i in id:
276.

277.                  p=psutil.Process(i)
278.

279.                  prcIo=getProcessIo(i)
280.

281.                  prcInf=getProcessInfo(p)
282.

283.                  addWriteXml(prcInf,prcIo)
284.

285.              time.sleep(ti)
286.

287.         
288.

289. def addWriteXml(prcInf,prcIo):  #追加xml数据
290.

291.     xmlHandle=ET.parse('/tmp/cpu2.xml')
292.

293.     root=xmlHandle.getroot()
294.

295.     processInfo=ET.SubElement(root,'ProcessInfo')
296.

297.     nameE=ET.Element('Name')
298.

299.     nameE.text=prcInf[0]
300.

301.     processInfo.append(nameE)
302.

303.     pidE=ET.Element('Pid')
304.

305.     pidE.text=str(prcInf[1])
306.

307.     processInfo.append(pidE)
308.

309.     rmsE=ET.Element('Rms')
310.

311.     rmsE.text=str(prcInf[2])
312.

313.     processInfo.append(rmsE)
314.

315.     vmsE=ET.Element('Vms')
316.

317.     vmsE.text=str(prcInf[3])
318.

319.     processInfo.append(vmsE)
320.

321.     cpuE=ET.Element('Cpu')
322.

323.     cpuE.text=str(prcInf[4])
324.

325.     processInfo.append(cpuE)
326.

327.     rcharE=ET.Element('Rchar')
328.

329.     rcharE.text=str(prcIo[0])
330.

331.     processInfo.append(rcharE)
332.

333.     wcharE=ET.Element('Wchar')
334.

335.     wcharE.text=str(prcIo[1])
336.

337.     processInfo.append(wcharE)
338.

339.     read_bytesE=ET.Element('Read_bytes')
340.

341.     read_bytesE.text=str(prcIo[4])
342.

343.     processInfo.append(read_bytesE)
344.

345.     write_bytesE=ET.Element('Write_bytes')
346.

347.     write_bytesE.text=str(prcIo[5])
348.

349.     processInfo.append(write_bytesE)
350.

351.     pid_tim=ET.Element('Time')
352.

353.     pid_tim.text=time.strftime('%Y-%m-%d %H-%M-%S',time.localtime(time.time()))
354.

355.     processInfo.append(pid_tim)
356.

357.     xmlHandle.write('/tmp/cpu2.xml')
358.

359.   
360.

361.   
362.

363.            
364.

365. def help_cpu():
366.

367.     print """#########################
368.

369.              -h list help information.
370.

371.              Executive Order python cpu.py name.exe  
372.

373.              Executive Order python cpu.py name.exe   Time         
374.

375.              time default is 300s
376.

377.              #######################################
378.

379.                """
380.

381.         
382.

383.


384.



385.         
386.

387. if __name__=="__main__":
388.

389.    sum=len(sys.argv)
390.

391.    try:
392.

393.        if sum<2:
394.

395.           help_cpu()
396.

397.        elif sum==2:
398.

399.           input=sys.argv[1]
400.

401.           if input=='-h':
402.

403.              help_cpu()
404.

405.           else:
406.

407.               shuchu(input)
408.

409.        elif  sum==3:
410.

411.            input=sys.argv[1]
412.

413.            input_Time=int(sys.argv[2])
414.

415.            shuchu(input,input_Time)
416.

417.    except KeyboardInterrupt:
418.

419.           print 'stopped'

复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值