1 分钟阅读 次阅读

命令

ps aux | awk '$8 ~ /D/ {print $0}'

示例输出

systemd+     523  0.0  0.0  25584 13196 ?        Ds   Jun17   0:07 /lib/systemd/systemd-resolved
root     2934884  0.0  0.1 559296 21308 ?        Dsl  Jun18   0:25 /usr/sbin/NetworkManager --no-daemon
root     2997274  0.0  0.0      0     0 ?        D    Jun19   0:00 [kworker/3:0+ipv6_addrconf]
root     2997694  0.0  0.0      0     0 ?        D<   Jun19   0:02 [kworker/u17:0+brcmf_wq/mmc2:0001:1]
root     2999190  0.0  0.0      0     0 ?        D    Jun19   0:00 [kworker/u16:2+events_power_efficient]
root     2999255  0.0  0.0  24660  7792 ?        Ds   Jun20   0:00 /usr/sbin/cups-browsed
systemd+ 2999278  0.0  0.0  25188 11788 ?        Ds   Jun20   0:00 /lib/systemd/systemd-resolved
systemd+ 2999291  0.0  0.0  25188 11884 ?        Ds   Jun20   0:00 /lib/systemd/systemd-resolved
systemd+ 3000876  0.0  0.0  25188 11508 ?        Ds   Jun20   0:00 /lib/systemd/systemd-resolved
root     3002059  0.0  0.0  24660  8204 ?        Ds   Jun21   0:00 /usr/sbin/cups-browsed
root     3005436  0.0  0.0 167552  4932 ?        Ds   Jun21   0:00 (fstrim)
root     3005473  0.0  0.0  24660  7932 ?        Ds   00:06   0:00 /usr/sbin/cups-browsed
root     3006664  0.1  0.0      0     0 ?        D    08:26   0:37 [kworker/4:2+events]

解读

一、 命令语法解读:ps aux | awk '$8 ~ /D/ {print $0}'

这个命令的作用是:找出当前系统中所有处于 D 状态(不可中断的睡眠状态)的进程,并将它们的详细信息打印出来。

具体拆解如下:

  • ps aux:用于收集当前系统所有运行中进程的详细快照。
  • a:显示所有关联了终端的进程(包括其他用户的进程)。
  • u:以“面向用户”的详细格式输出(即包含 USER、%CPU、%MEM 等列)。
  • x:显示没有控制终端的后台进程(守护进程)。

  • | (管道符):将左边 ps aux 的输出结果,直接作为传递给右边命令的输入数据。
  • awk '$8 ~ /D/ {print $0}':使用 awk 这个强大的文本处理工具进行逐行过滤。
  • $8:代表每一行的第 8 列数据。在 ps aux 的输出中,第 8 列刚好是 STAT(进程状态)列。
  • ~:正则表达式匹配符号,意思是“包含”或“符合”。
  • /D/:匹配大写字母 D。在进程状态里,D 代表不可中断睡眠(通常是在等待磁盘读写或网络 I/O)。
  • {print $0}:当满足前面的条件时执行的动作。$0 代表打印完整的当前行内容。(补充说明:在 awk 中,{print $0} 是匹配成功的默认动作,所以这个命令其实可以简写为 awk '$8 ~ /D/')。

二、 每一列的含义

systemd+ 523 0.0 0.0 25584 13196 ? Ds Jun17 0:07 /lib/systemd/systemd-resolved

  • USER (systemd+):进程的所有者(运行该进程的系统用户)。末尾的 + 号表示完整的用户名超出了列的默认宽度,被截断了。
  • PID (523):进程的唯一 ID 编号。如果你想强行结束进程(比如用 kill 命令),用的就是这个数字。
  • %CPU (0.0):该进程自启动以来占用的 CPU 时间百分比。
  • %MEM (0.0):该进程占用的物理内存百分比。
  • VSZ (25584):虚拟内存大小 (Virtual Memory Size),单位为 KB。表示进程总共申请了多少虚拟内存(包括分配了但还没实际使用的部分)。
  • RSS (13196):常驻内存集 (Resident Set Size),单位为 KB。这是进程实际驻留在物理内存中的大小。
  • TTY (?):该进程运行所在的终端。显示为 ? 代表它是后台运行的守护进程,不依赖任何终端。
  • STAT (Ds):进程当前的状态(也就是你命令中 $8 筛选的重点)。字母组合表示不同的附加状态:
  • D:不可中断的睡眠状态 (Uninterruptible sleep)。通常意味着进程正在死等 I/O 操作完成,此时它连 kill -9 信号都不响应。
  • s:会话首进程 (Session leader),通常意味着它下面还有子进程。
  • l:多线程进程 (Multi-threaded)。
  • <:高优先级进程。

  • START (Jun17):进程启动的日期或时间。
  • TIME (0:07):进程实际占用 CPU 计算的累计总时间(格式为 分:秒),而不是它存活了多久。
  • COMMAND (/lib/systemd/...):启动该进程时执行的具体命令路径和参数。如果是被中括号 [] 包围的(如结果中的 [kworker/3:0...]),代表这是操作系统的内核线程,通常用于处理底层硬件或系统级任务。

留下评论