Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Python 找出占用系统swap的程序

今天程序哥说机器不断死机,后发现是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.  
  5. import re 
  6. import sys 
  7. import os 
  8.  
  9. def check(pid): 
  10.     #获取SWAP大小 
  11.     file_smaps = "/".join(["/proc",pid,"smaps"]) 
  12.     f = open(file_smaps,"r") 
  13.     content1 = f.read() 
  14.     f.close()   
  15.     pattern1 = r"Swap:s+(.*)s+kB" 
  16.     find1 = re.compile(pattern1) 
  17.     sum = 0 
  18.     for size in  find1.findall(content1): 
  19.         sum = sum + int(size) 
  20.          
  21.     #获取进程名称 
  22.     file_status = "/".join(["/proc",pid,"status"]) 
  23.     s = open(file_status, "r") 
  24.     content2 = s.read() 
  25.     s.close() 
  26.     pattern2 = r"Name:s+(.*)" 
  27.     find2 = re.compile(pattern2) 
  28.     name = find2.findall(content2)[0] 
  29.      
  30.     return name,sum 
  31.  
  32. if __name__ == "__main__": 
  33.     print "脚本将列出有占用SWAP的程序ID和占用的SWAP大小:" 
  34.     print "%-5s    %-10s    %s" %    ("PID","SWAP(kB)","NAME") 
  35.     print "----------------------------------------------------" 
  36.     for pid in  os.listdir("/proc"): 
  37.         if pid.isdigit(): 
  38.             name,size = check(pid) 
  39.             if size: 
  40.                 print "%-5s    %-10s    %s" %    (pid, size, name) 
运行效果如下图: