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' 复制代码 |