linux下检测每个进程占用swap大小

#!/bin/bash
########################################
# 脚本功能 : 列出正在占用swap的进程。
########################################
echo -e "PID\t\tSwap\tProc_Name"
 
# 拿出/proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)
for pid in `ls -l /proc|awk '/^d/ {print $NF}'|grep ^[0-9]`
do

 # Do not check init process
 if [ $pid -eq 1 ];then continue;fi 

 # 判断改进程是否占用了swap
 grep -q "Swap" /proc/$pid/smaps 2>/dev/null

 if [ $? -eq 0 ];then # 如果占用了swap
     swap=$(grep Swap /proc/$pid/smaps| gawk '{ sum+=$2} END{ print sum }')

     # 进程名
     #proc_name=$(ps aux | grep -w "$pid" | grep -v grep 
     proc_name=$(ps -eo pid,comm | grep -w "$pid" | grep -v grep|awk '{print $NF}')

     if [ $swap -ge 0 ];then # 如果占用了swap则输出其信息
         echo -e "$pid\t${swap}\t$proc_name"
     fi
 fi
done | sort -k2 -n | gawk -F'\t' '{ 
 pid[NR]=$1;
 size[NR]=$2;
 name[NR]=$3;
}
END{
 for(id=1;id<=length(pid);id++)
 {
     if(size[id]<1024)
           printf("%-10s\t%10sKB\t%s\n",pid[id],size[id],name[id]);
     else if(size[id]<1048576)
           printf("%-10s\t%10.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);
     else
   printf("%-10s\t%10.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);
 }
}'

 

 1 #!/usr/bin/env python
 2 import re,os
 3 #Swap: 0 kB
 4 def check_swap(pid):
 5         try:
 6                 f_name='/proc/'+pid+'/smaps'
 7                 f = open(f_name)
 8                 lines=f.readlines()
 9                 f.close()
10                 size = 0
11                 pattern=r'Swap:\s+(\d+)'
12                 for line in lines:
13                         if re.compile(pattern).findall(line):
14                                 size += int(re.compile(pattern).findall(line)[0])
15                 return pid,size
16         except:
17                 #print "Erro"
18                 pass
19 def get_name(pid):
20         try:
21                 f_name='/proc/'+pid+'/status'
22                 f = open(f_name)
23                 line=f.readline()
24                 f.close()
25                 name = line.split(':')[-1].split()[0] 
26                 return name
27         except:
28                 pass
29 if __name__=='__main__':
30         print 'PID\tSWAP-SIZE\tNAME'
31         print os.getpid()
32         print '----------------'
33         for pid in os.listdir('/proc'):
34           if pid.isdigit(): 
35                 info = check_swap(pid)
36                 if (info[1]>0) :#and info[-1]:
37                         print "%s\t%s\t%s" % (info[0],info[1],get_name(pid))

 

posted @ 2015-09-11 16:06  [言_午]  阅读(2614)  评论(0编辑  收藏  举报