ps命令用法详解与技巧总结

一、概述

psProcess Status 的缩写,用于输出当前系统进程的快照信息。它是 Linux 系统中最基本且最强大的进程查看命令,可以用来确定哪些进程正在运行、进程的运行状态、是否存在僵尸进程、哪些进程占用资源过多等-。

注意ps 显示的是执行瞬间的进程状态快照,不会动态更新。如需实时监控进程,应使用 top 命令。

bash 复制代码
ps --help a


用法:
 ps [选项]

基本选项:
 -A, -e               all processes
 -a                   all with tty, except session leaders
  a                   all with tty, including other users
 -d                   all except session leaders
 -N, --deselect       negate selection
  r                   only running processes
  T                   all processes on this terminal
  x                   processes without controlling ttys

Selection by list:
 -C <命令>            命令名称
 -G, --Group <GID>    real group id or name
 -g, --group <group>  session or effective group name
 -p, p, --pid <PID>   进程编号
        --ppid <PID>  父进程编号
 -q, q, --quick-pid <PID>
                      process id (quick mode)
 -s, --sid <session>  session id
 -t, t, --tty <tty>   终端
 -u, U, --user <UID>  effective user id or name
 -U, --User <UID>     真实用户编号或名称

  The selection options take as their argument either:
    a comma-separated list e.g. '-u root,nobody' or
    a blank-separated list e.g. '-p 123 4567'

输出格式:
 -D <format>          date format for lstart
 -F                   extra full
 -f                   完整格式,包含命令行
  f, --forest         ascii 字符艺术显示的进程树
 -H                   show process hierarchy
 -j                   jobs format
  j                   BSD 任务控制格式
 -l                   长格式
  l                   BSD 长格式
 -M, Z                添加安全数据(用于 SELinux)
 -O <format>          preloaded with default columns
  O <format>          as -O, with BSD personality
 -o, o, --format <格式>
                      用户定义的格式
  -P                  add psr column
  s                   信号格式
  u                   user-oriented format
  v                   虚拟内存格式
  X                   寄存器格式
 -y                   do not show flags, show rss vs. addr (used with -l)
     --context        显示安全上下文(用于 SELinux)
     --headers        repeat header lines, one per page
     --no-headers     do not print header at all
     --cols, --columns, --width <num>
                      set screen width
     --rows, --lines <num>
                      set screen height
     --signames       display signal masks using signal names

Show threads:
  H                   as if they were processes
 -L                   possibly with LWP and NLWP columns
 -m, m                after processes
 -T                   possibly with SPID column

Miscellaneous options:
 -c                   show scheduling class with -l option
  c                   show true command name
  e                   show the environment after command
  k,    --sort        specify sort order as: [+|-]key[,[+|-]key[,...]]
  L                   show format specifiers
  n                   display numeric uid and wchan
  S,    --cumulative  include some dead child process data
 -y                   do not show flags, show rss (only with -l)
 -V, V, --version     display version information and exit
 -w, w                不限制输出宽度

        --help <simple|list|output|threads|misc|all>
        --help <s|l|o|t|m|a>
                      显示帮助信息并退出

二、选项的三种风格

ps 命令支持三种不同风格的选项,它们可以混合使用,但为避免冲突,建议保持一致:

风格 格式 示例
UNIX 风格 前面加一个短横线 -,可分组 ps -ef
BSD 风格 不加短横线,可分组 ps aux
GNU 长选项 前面加两个短横线 -- ps --sort

三、最常用的命令组合

1. ps aux ------ BSD 风格,显示所有进程的详细信息

bash 复制代码
ps aux

这是最常用的组合之一:

  • a:显示所有用户的进程-

  • u:以用户为中心格式输出,显示 CPU/内存占用百分比

  • x:显示没有控制终端的进程(如守护进程)

2. ps -ef ------ UNIX 风格,显示所有进程的完整格式

bash 复制代码
ps -ef
  • -e :显示所有进程(等同于 -A

  • -f:完整格式输出,显示更多字段信息

3. 两者区别

特点 ps aux ps -ef
风格 BSD UNIX
特点 显示 CPU/内存占用百分比 显示父进程 ID (PPID)
适用场景 查看资源占用情况 查看进程父子关系

四、输出字段详解

ps aux 输出字段

字段 含义
USER 运行该进程的用户
PID 进程 ID
%CPU CPU 使用率百分比
%MEM 物理内存使用率百分比
VSZ 虚拟内存大小(KB)
RSS 实际物理内存大小(KB)
TTY 控制终端名称(? 表示无终端)
STAT 进程状态(见下方说明)
START 进程启动时间
TIME 累计占用 CPU 时间
COMMAND 启动进程的命令

ps -ef 输出字段

字段 含义
UID 用户 ID
PID 进程 ID
PPID 父进程 ID
C CPU 调度优先级因子
STIME 进程启动时间
TTY 完整终端名称
TIME 累计 CPU 时间
CMD 完整命令和参数

进程状态码 (STAT)

状态 含义
R 正在运行或可运行(在运行队列中)
S 可中断的睡眠(等待事件完成)
D 不可中断的睡眠(通常与硬件 I/O 相关)
Z 僵尸进程(已终止但未被父进程回收)
T 被信号暂停或停止
s 包含子进程(会话首进程)
+ 位于前台进程组

五、高级技巧与场景化应用

1. 查看进程树

bash 复制代码
ps -ejH          # UNIX 风格
ps axjf          # BSD 风格[reference:26][reference:27]

j 显示作业控制信息,-H 以树状结构展示进程层级

2. 查看线程信息

bash 复制代码
ps -eLf         # 显示所有进程的线程信息
ps axms         # BSD 风格

# 查看该进程的内存占用详情 (VSZ是虚拟内存,RSS是物理内存)
ps -p {$pid} -o pid,vsz,rss,cmd

# 查看该进程下所有线程的CPU和内存使用情况
ps -eLf | grep {$pid}

-L 会显示 LWP(轻量级进程/线程)列。

3. 按 CPU 或内存排序

bash 复制代码
# 按 CPU 使用率降序排列,显示前 10 个
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -10

# 按内存使用量排序
ps --sort size

-o 用于自定义输出字段,--sort=-%cpu 中的 - 表示降序排列。

4. 查看特定用户的进程

bash 复制代码
ps -u username          # 查看指定用户的进程
ps -U root -u root u    # 查看以 root 身份运行的所有进程

5. 按进程名筛选

bash 复制代码
ps -C syslogd -o pid=        # 仅打印 syslogd 的 PID
ps -C nginx -o pid,cmd       # 查看 nginx 的 PID 和命令

6. 查找僵尸进程

bash 复制代码
ps -A -ostat,pid | grep -e '^[Zz]'

通过状态字段筛选出僵尸进程,然后可以用 kill -9 PPID 终止其父进程来回收资源。

7. 显示完整命令(不截断)

默认情况下,ps 会截断超过 80 列的命令行。使用 ww 选项可以显示完整命令:

bash 复制代码
ps auxww        # 显示所有进程的完整命令
ps -p 12345 -ww # 查看指定 PID 的完整命令

8. 自定义输出格式

bash 复制代码
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
ps -o ppid= -p 12345        # 仅获取某进程的 PPID

-o 后面跟以逗号或空格分隔的字段列表,可重命名列标题-。

9. 过滤时排除 grep 自身

bash 复制代码
ps aux | grep '[h]ttpd'     # 使用方括号技巧排除 grep 自身
ps aux | grep httpd | grep -v grep

六、实用技巧总结

需求 命令
查看所有进程(最常用) ps auxps -ef
查看进程树 ps axjfps -ejH
查看线程 ps -eLf
按 CPU 排序 ps -eo pid,cmd,%cpu --sort=-%cpu
按内存排序 ps -eo pid,cmd,%mem --sort=-%mem
查看特定用户 ps -u username
按进程名查找 ps -C process_name
显示完整命令 ps auxww
查找僵尸进程 `ps -A -ostat,pid
自定义输出 ps -o pid,user,command

ps 命令参数繁多,日常使用中掌握上述组合已能覆盖绝大多数场景。详细用法可参考 man p。