歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python 找出占用系統swap的程序

Python 找出占用系統swap的程序

日期:2017/3/1 10:08:24   编辑:Linux編程

今天程序哥說機器不斷死機,後發現是swap用完了導致,現需要找出哪些進程占用了swap,網上找了一下辦法,就是查看/proc下面的進程號目錄裡面的smaps文件,如下:

tail -n 18 /proc/19454/smaps

  1. ffde1000-ffdf6000 rw-p 7ffffffea000 00:00 0 [stack]
  2. Size: 84 kB
  3. Rss: 8 kB
  4. Shared_Clean: 0 kB
  5. Shared_Dirty: 0 kB
  6. Private_Clean: 0 kB
  7. Private_Dirty: 8 kB
  8. Swap: 0 kB
  9. Pss: 8 kB
  10. ffffe000-fffff000 r-xp ffffe000 00:00 0
  11. Size: 4 kB
  12. Rss: 4 kB
  13. Shared_Clean: 4 kB
  14. Shared_Dirty: 0 kB
  15. Private_Clean: 0 kB
  16. Private_Dirty: 0 kB
  17. Swap: 0 kB
  18. Pss: 0 kB

這裡中間有幾行“Swap 0 kB”,將文件中所有這些行的值加起來就是這個進程占用的SWAP值,有方法了就寫成腳本吧,Python腳本如下:

  1. #!/usr/bin/python
  2. #coding:utf-8
  3. #列出系統進程占用SWAP的情況!
  4. import re
  5. import sys
  6. import os
  7. def check(pid):
  8. #獲取SWAP大小
  9. file_smaps = '/'.join(["/proc",pid,"smaps"])
  10. f = open(file_smaps,'r')
  11. content1 = f.read()
  12. f.close()
  13. pattern1 = r'Swap:\s+(.*)\s+kB'
  14. find1 = re.compile(pattern1)
  15. sum = 0
  16. for size in find1.findall(content1):
  17. sum = sum + int(size)
  18. #獲取進程名稱
  19. file_status = '/'.join(["/proc",pid,"status"])
  20. s = open(file_status, 'r')
  21. content2 = s.read()
  22. s.close()
  23. pattern2 = r'Name:\s+(.*)'
  24. find2 = re.compile(pattern2)
  25. name = find2.findall(content2)[0]
  26. return name,sum
  27. if __name__ == "__main__":
  28. print "腳本將列出有占用SWAP的程序ID和占用的SWAP大小:"
  29. print "%-5s %-10s %s" % ('PID','SWAP(kB)','NAME')
  30. print "----------------------------------------------------"
  31. for pid in os.listdir("/proc"):
  32. if pid.isdigit():
  33. name,size = check(pid)
  34. if size:
  35. print "%-5s %-10s %s" % (pid, size, name)

運行效果如下圖:

Copyright © Linux教程網 All Rights Reserved