获得一个进程的交换使用

我正在寻找一种方法,从一个shell脚本,以获得特定进程的交换使用。 顶部可以显示此信息,但仅限于交互模式。 批处理模式将仅显示.toprc存在时的自定义设置,但不能在命令行上指定特定的.toprc。 我发现这个脚本 ,但是在我的服务器上/ proc / * / smaps中没有交换项:

# find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi swap '{}'/smaps \; # 

所以脚本只为每个进程输出0。

有没有办法find这些信息? 我在RHEL5.1 2.6.18-53.el5 x86_64上。

编辑:

要清楚的是,当我询问“交换使用情况”时,我指的是已经被分页到交换文件系统(当前不在主内存中)的进程使用的内存量。 假设没有更好的方法,我将默认使用(虚拟 – rss)通过ps -o vsz,rss的值来计算它。

一个有趣的问题让我挠了一阵子。

首先,为什么你没有交换线:虽然在理论上是在内核2.6.16中添加的,但直到5.3左右(内核2.6.18-99.el5)才在RHEL中显示。 这里是提交(不幸的是不能在RH Bugzilla中访问;如果你碰巧拥有一个具有适当权限的帐户,Bugzilla ID是443749)。 http://sophie2.aero.jussieu.fr/distrib/Scientific%20Linux/5x/i386/by-pkgid/351d529f9beeb4e5d936a6d5e3e7813a/files/645

其次,这意味着最重要的数据是不可靠的,因为它不是从smaps中读取的(也就是virt-res):

  case P_SWP: MKCOL(scale_num(PAGES_TO_KB(p->size - p->resident), w, s)); 

第三,我很遗憾地说,内核是使用多less交换的“真正的Oracle”,并且据我所知,各种补丁可以使信息以smaps和status的forms显示,这是揭露这些信息的唯一途径。 不幸的是,我发现更新内核是获取准确信息的唯一方法。 或者通过自己修补源( 示例补丁,不保修 )或更新到内核2.6.18-99.el5。

我希望有一个更容易的答案; 责备莱纳斯。

查看/proc/<pid>/status 。 你会看到一个VmSwap线。

它看起来像从CentOS 5( 1 )的ps(1)手册页,你可以指定vsize(VSZ)作为输出字段,所以会像这样:

 /bin/ps -p $pid -o vsize= 

为你做诡计吗? 这提取“在KiB(1024字节单位)的进程的虚拟内存大小”和=使它离开列标题。