Linux系统小技巧(5):如何列出和排序正在读写的进程?

    xiaoxiao2022-07-09  215

    哪些进程这在对写?试试iotop。但是有时候并不方便安装部署iotop,而且iotop的输出也容易进一步分析处理。

    那么,有没有其他方式方便做到这一点呢?有。在说出答案前,我们先看看一个实际/proc/<pid>/io文件的内容

    rchar: 951610978 wchar: 1180044763 syscr: 133011 syscw: 120643 read_bytes: 77246464 write_bytes: 735604736 cancelled_write_bytes: 98304

    根据内核文档,rchar和wchar即是进程已经提交但还没有完成的的读写操作要处理的内容。因此逐一遍历进程,即可计数正在读写的进程并且予以适当排序。

    比如,列出正在发起读操作的前20个进程,我们可以这样办理

    for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \ if [ -e /proc/${pid} ];then \ num=$(cat /proc/${pid}/io | grep -E '^rchar:' | cut -d ' ' -f 2);\ echo "${num} ${pid}";\ fi;\ done | sort -n -r | head -20

    当然,上面的命令稍加改动就可以用到正在写的进程上

    for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \ if [ -e /proc/${pid} ];then \ num=$(cat /proc/${pid}/io | grep -E '^wchar:' | cut -d ' ' -f 2);\ echo "${num} ${pid}";\ fi;\ done | sort -n -r | head -20

    以上两个命令的执行示例如下

    root@demo:~# for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \ > if [ -e /proc/${pid} ];then \ > num=$(cat /proc/${pid}/io | grep -E '^rchar:' | cut -d ' ' -f 2);\ > echo "${num} ${pid}";\ > fi;\ > done | sort -n -r | head -20 28908475231 1 5022495635 1309 3647776277 906 1537484053 1806 1091171589 1388 955070588 31283 445533142 1458 325857806 920 148582179 893 75633008 9729 75169817 2068 74541144 2038 74355216 2067 73356682 2085 70308680 2073 50819715 1873 48753553 2080 48556521 1436 47121818 1709 41993240 29162 root@demo:~# for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \ > if [ -e /proc/${pid} ];then \ > num=$(cat /proc/${pid}/io | grep -E '^wchar:' | cut -d ' ' -f 2);\ > echo "${num} ${pid}";\ > fi;\ > done | sort -n -r | head -20 1180115284 31283 502324828 1 488319291 906 94696438 1309 61642095 1458 41535896 893 39210225 29162 15680109 1359 9482873 2068 5626696 1756 5545914 1709 4047538 1677 2944955 478 2602756 19648 2065398 22388 2060970 22389 1816383 19644 1687956 1307 1548644 19647 1545858 19645 root@demo:~#
    最新回复(0)