歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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) 

運行效果如下圖:

 

 

 

 

 

Copyright © Linux教程網 All Rights Reserved