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) 

运行效果如下图:

 

你可能感兴趣的:(linux,python,swap)