张芷铭的个人博客

ps

ps 命令是 Linux 系统中用于查看进程状态的核心工具,它能提供系统在命令执行时刻的进程快照。下面这张表格汇总了它的两种主要参数风格和输出特点,帮助你快速建立整体印象。

特性UNIX 风格 (选项前有 -)BSD 风格 (选项前无 -)
常用命令ps -e, ps -ef, ps -eFps aux, ps ax
输出特点显示进程的 UID, PID, PPID 等基础信息显示进程的 %CPU, %MEM, STAT 等详细资源信息
适用场景查看进程的父子关系 (通过 PPID)分析进程的 CPU/内存占用详细状态

🔍 理解进程状态 STAT

ps aux 的输出中,STAT 列指明了进程的当前状态,这是排查问题的关键。状态码可以是多个字母的组合:

  • 基本状态码
    • R:正在运行或在运行队列中等待。
    • S:中断睡眠,等待事件完成(如 I/O 操作),可被唤醒。
    • D:不可中断睡眠,通常在进行硬件 I/O,不能强制终止。
    • T:停止,通常由于收到信号(如 SIGSTOP)。
    • Z:僵尸进程,进程已终止但资源未被父进程回收。
  • 附加符号(进一步说明):
    • <:高优先级。
    • N:低优先级。
    • s:该进程是会话领导者(session leader)。
    • l:多线程进程。
    • +:位于前台进程组。

💡 常见使用场景

掌握基础后,你可以通过组合使用 ps 和其他命令来解决具体问题。

  1. 查找特定进程 最常用的方法是结合 grep 进行过滤。例如,查找所有 nginx 进程:

    1
    
    ps -ef | grep nginx
    

    或是使用不区分大小写的查找:

    1
    
    ps aux | grep -i "python"
    
  2. 查看进程树关系 使用 --forest 选项可以直观地显示进程的父子层级关系:

    1
    
    ps -ef --forest
    

    或者使用 -ejH 选项,以缩进方式显示。

  3. 按资源占用排序 要找出系统中占用 CPU 或内存最高的进程,可以使用 --sort 选项。

    • 按 CPU 使用率降序,查看前 5 个进程:
      1
      
      ps aux --sort=-%cpu | head -5
      
    • 按内存使用率降序,查看前 5 个进程:
      1
      
      ps aux --sort=-%mem | head -5
      

    -%cpu-%mem 中的负号表示降序,升序则去掉负号。)

  4. 显示指定用户的进程 使用 -u 参数查看特定用户(如 root)的进程:

    1
    
    ps -u root
    
  5. 显示进程的线程 使用 -L-T 选项可以查看特定进程的线程信息(轻量级进程,LWP)。

    1
    2
    
    ps -T -p <PID> # 查看指定进程的线程
    ps -eLf # 显示所有线程
    

🛠️ 高级技巧与注意事项

  • 自定义输出字段:使用 -o 选项可以完全自定义输出的列,这在编写脚本时非常有用。例如,只显示进程的 PID、命令名和内存占用:

    1
    
    ps -eo pid,cmd,%mem
    
  • 动态监控ps 是静态快照。若想动态监控(如每秒刷新一次内存占用最高的进程),可以结合 watch 命令:

    1
    
    watch -n 1 'ps aux --sort=-%mem | head -n 5'
    
  • 处理僵尸进程:如果发现 STATZ 的僵尸进程,直接 kill 僵尸进程本身是无效的。正确的做法是找到并重启其父进程(PPID)。

  • top 命令的区别ps 提供的是当前时刻的进程状态,适合精确筛选和脚本集成。top 则提供动态、实时更新的界面,更适合交互式监控系统整体资源状况。

💎 总结

ps 命令是 Linux 系统管理和故障排查的利器。核心在于掌握 ps -efps aux 这两种最常用的形式,并理解 STAT 状态码的含义。之后,你可以通过管道符结合 grep, sort, head 等工具,灵活地查找、排序和筛选进程信息。

希望这份详细的解释能帮助你更好地使用 ps 命令。如果你对某个具体场景有更深入的问题,我很乐意继续探讨。


ps 命令的 BSD风格 是其在 Linux 系统中三种主要选项风格之一(另外两种是 UNIX 风格和 GNU 长选项风格)。它最主要的特点是其选项前不带短横线(-

为了让你快速抓住核心,下面这个表格清晰地对比了 BSD 风格与另一种常见的 UNIX 风格的主要区别。

特性BSD 风格UNIX 风格 (Standard-Style)
选项前缀不带 - (例如 aux)必须带 - (例如 -ef)
设计起源加州大学伯克利分校的 BSD 系统AT&T 的原始 UNIX 系统
常用命令示例ps aux, ps axps -ef, ps -eF
默认输出信息更侧重资源使用情况,如 %CPU, %MEM, VSZ, RSS 和详细进程状态 STAT更侧重进程关系,如 PID, PPID(父进程ID), CMD

💡 深入理解STAT状态码

在使用 ps aux 时,STAT 列提供了进程的详细状态信息,这是排查系统问题时非常关键的指标。状态码由一个主字母和可能的附加符号组成:

  • 基本状态码
    • R:进程正在运行或位于运行队列中等待执行。
    • S:可中断的睡眠,进程正在等待某个事件完成(如I/O操作)。
    • D:不可中断的睡眠,通常与硬件I/O相关,此状态进程不能强制终止。
    • T:进程已停止,通常是由于收到了作业控制信号(如 SIGSTOP)或被调试器追踪。
    • Z:僵尸进程,进程已终止,但其父进程尚未回收其资源。
  • 附加符号(提供更多信息):
    • <:高优先级进程。
    • N:低优先级进程。
    • s:该进程是一个会话领导者(session leader)。
    • l:多线程进程。
    • +:进程位于前台进程组中。

🛠️ 常用BSD风格命令组合与实践

除了最经典的 ps aux(显示所有进程的完整信息),还有其他一些有用的BSD风格命令组合:

  • ps ax:显示所有进程,输出格式比 aux 简洁一些。
  • ps u -p <PID>:查看指定进程ID(PID)的详细信息,并以用户导向的格式显示。
  • ps aux --sort=-%cpu | head -5:按CPU使用率降序排序,并显示消耗最高的5个进程。

💎 总结与如何选择

简单来说:

  • 当你需要快速查看进程对系统资源(CPU、内存)的占用情况时,应首选 BSD风格ps aux
  • 当你更关心进程的父子关系(PPID)或想要更标准的语法时,可以使用 UNIX风格ps -ef

希望这个解释能帮助你更好地理解和使用 ps 命令的BSD风格。

💬 评论