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

简介: 如何利用经典UNIX工具列出正在读写的进程并且排序之?

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

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

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

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

比如,列出正在发起读操作的前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:~#
相关文章
|
6天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
25 5
linux系统服务二!
|
6天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
30 4
linux进程管理万字详解!!!
|
6天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
25 3
linux系统服务!!!
|
6天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
30 4
|
6天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
23 2
|
7天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
8天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
8天前
|
消息中间件 存储 Linux
|
Linux Perl Ubuntu
Linux小技巧总结
1、fdisk创建磁盘分区不重启系统partprobe 使用fdisk工具只是将分区信息写到磁盘,如果需要mkfs磁盘分区则需要重启系统才能够读取到/dev/sda*,而使用partprobe则可以使kernel重新读取分区信息,避免重启系统。
865 0
|
17天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
59 4
下一篇
无影云桌面