Linux ps 命令

ps 命令用于显示当前进程的状态。它是进程监控和系统管理中最重要的工具之一

语法格式

ps [选项]
注意:ps命令有三种语法风格:
  1. UNIX风格:选项前加 -,如 ps -ef
  2. BSD风格:选项前不加 -,如 ps aux
  3. GNU风格:选项前加 --,如 ps --pid 1234

常用选项

选项 说明 风格
a 显示所有用户的进程 BSD
u 显示进程的详细用户信息 BSD
x 显示没有控制终端的进程 BSD
e 显示所有进程(包括环境变量) UNIX
f 显示完整的进程树格式 UNIX
-e-A 显示所有进程 UNIX
-f 显示完整格式 UNIX
-l 显示长格式 UNIX
-p PID 显示指定PID的进程 UNIX
-u user 显示指定用户的进程 UNIX
--sort 按指定字段排序 GNU
--forest 显示进程树 GNU

进程状态说明

状态码 含义 说明
R 运行中 进程正在运行或可运行(在运行队列中)
S 休眠中 进程在等待事件完成(可中断的休眠)
D 不可中断休眠 进程在等待I/O操作(不可中断的休眠)
Z 僵尸进程 进程已终止但未回收
T 已停止 进程被作业控制信号停止
I 空闲状态 内核线程的空闲状态

命令示例

示例1:显示当前用户的进程

显示当前用户的所有进程:

ps

显示当前用户的进程,包含详细信息:

ps -u

输出示例:

  PID TTY          TIME CMD
 1234 pts/0    00:00:00 bash
 5678 pts/0    00:00:00 ps
示例2:显示所有进程(经典用法)

BSD风格(最常用):

ps aux

UNIX风格:

ps -ef

输出字段说明:

  • USER:进程所有者
  • PID:进程ID
  • %CPU:CPU使用率
  • %MEM:内存使用率
  • VSZ:虚拟内存大小(KB)
  • RSS:物理内存大小(KB)
  • TTY:终端设备
  • STAT:进程状态
  • START:启动时间
  • TIME:累计CPU时间
  • COMMAND:命令名称
示例3:显示进程树

显示进程的父子关系:

ps -ef --forest

或使用:

ps auxf

输出示例:

root         1  0.0  0.0  16920  1220 ?        Ss   Mar10   0:01 /sbin/init
root       456  0.0  0.0  19780   892 ?        S    Mar10   0:00  \_ /usr/sbin/sshd
root      1234  0.0  0.0  21236  1236 ?        Ss   09:30   0:00      \_ sshd: john [priv]
john      1235  0.0  0.0  21236  1008 ?        S    09:30   0:00          \_ sshd: john@pts/0
john      1236  0.0  0.0  11524  1828 pts/0    Ss   09:30   0:00              \_ -bash
john      5678  0.0  0.0  13948   936 pts/0    R+   10:15   0:00                  \_ ps auxf
示例4:按特定条件筛选进程

按用户筛选:

ps -u root

按PID筛选:

ps -p 1234,5678

按进程名筛选:

ps -C nginx

排除特定进程:

ps -N -C bash
示例5:排序和格式化输出

按CPU使用率降序排序:

ps aux --sort=-%cpu | head -10

按内存使用率降序排序:

ps aux --sort=-%mem | head -10

自定义输出格式:

ps -eo pid,user,cmd,%cpu,%mem --sort=-%cpu | head -10

显示线程信息:

ps -eLf
示例6:实时监控进程

结合watch命令实时监控:

# 每2秒刷新一次
watch -n 2 'ps aux --sort=-%cpu | head -10'

# 监控特定进程
watch -n 1 'ps -p 1234 -o pid,user,%cpu,%mem,cmd'
提示:对于持续监控,更推荐使用 tophtop 命令

实际应用场景

场景1:系统性能分析

分析系统资源使用情况:

#!/bin/bash
# 系统性能分析脚本

echo "=== 系统进程资源使用情况 ==="
echo ""

echo "1. CPU使用率最高的10个进程:"
ps aux --sort=-%cpu | head -11 | awk 'NR>1 {print $2 "\t" $3 "\t" $11}'

echo ""
echo "2. 内存使用率最高的10个进程:"
ps aux --sort=-%mem | head -11 | awk 'NR>1 {print $2 "\t" $4 "\t" $11}'

echo ""
echo "3. 总进程数:"
ps -e | wc -l

echo ""
echo "4. 各状态进程统计:"
ps -eo stat | sort | uniq -c

echo ""
echo "5. 僵尸进程检查:"
ps -eo pid,stat,cmd | grep -w Z
场景2:故障排查

排查系统问题和异常进程:

# 查找占用CPU过高的进程
ps aux | awk '$3 > 50 {print $0}'

# 查找占用内存过高的进程
ps aux | awk '$4 > 10 {print $0}'

# 查找僵尸进程
ps aux | grep -w Z

# 查找特定服务的进程
ps aux | grep -E "(nginx|apache|mysql)"

# 查看进程的完整命令行
ps -ef | grep nginx

# 查看进程打开的文件
lsof -p 1234
场景3:自动化管理脚本

在脚本中使用ps进行进程管理:

#!/bin/bash
# 进程管理脚本

# 检查进程是否存在
check_process() {
    local process_name=$1
    if ps aux | grep -v grep | grep -q "$process_name"; then
        echo "进程 $process_name 正在运行"
        return 0
    else
        echo "进程 $process_name 未运行"
        return 1
    fi
}

# 获取进程PID
get_pid() {
    local process_name=$1
    ps aux | grep -v grep | grep "$process_name" | awk '{print $2}'
}

# 监控并重启进程
monitor_and_restart() {
    local process_name=$1
    local restart_command=$2

    if ! check_process "$process_name"; then
        echo "正在重启 $process_name..."
        eval "$restart_command"
        if check_process "$process_name"; then
            echo "$process_name 重启成功"
        else
            echo "$process_name 重启失败"
        fi
    fi
}

# 使用示例
monitor_and_restart "nginx" "systemctl start nginx"

高级用法

命令 说明 示例
ps -L 显示线程信息 ps -Lf -p 1234
ps -o 自定义输出格式 ps -eo pid,user,pcpu,pmem,cmd
ps -H 显示进程层次结构 ps -eH
ps -M 显示安全上下文(SELinux) ps -eZ
ps -j 显示作业信息 ps -ej
ps -T 显示线程(SPID列) ps -T -p 1234

相关命令对比

命令 功能 特点 适用场景
ps 进程快照 静态查看,功能丰富 详细分析、脚本处理
top 实时进程监控 动态刷新,交互式 实时监控、性能分析
htop 增强版top 图形化界面,鼠标支持 交互式监控、进程管理
pstree 进程树显示 树状结构,直观 查看进程父子关系
pgrep 按名称查找进程 查找方便 快速查找进程PID
pidof 查找进程PID 简单直接 获取进程PID

常见问题解答

ps aux(BSD风格):

  • 显示所有用户的进程
  • 显示详细的用户信息(USER列)
  • 显示CPU和内存使用率(%CPU, %MEM)
  • 显示虚拟内存和物理内存大小(VSZ, RSS)
  • 格式:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

ps -ef(UNIX风格):

  • 显示所有进程
  • 显示父进程ID(PPID)
  • 显示进程启动时间(STIME)
  • 显示完整的命令行(包括参数)
  • 格式:UID PID PPID C STIME TTY TIME CMD

总结:ps aux更适合查看资源使用情况,ps -ef更适合查看进程关系和完整命令。

有多种方法查看特定用户的进程:

# 方法1:使用-u选项
ps -u username
ps aux -u username

# 方法2:使用grep过滤
ps aux | grep ^username
ps -ef | grep ^username

# 方法3:显示所有用户,然后筛选
ps aux | awk '$1 == "username"'

# 方法4:查看用户及其子用户的进程
ps -U username -u username

例如查看root用户的进程:

ps -u root
ps aux | grep ^root

查看进程的完整命令行(包括所有参数):

# 使用-f或-full选项
ps -f -p 1234
ps -ef | grep process_name

# 使用ww选项显示不截断的命令行
ps auxww | grep process_name

# 使用-o cmd选项
ps -p 1234 -o cmd

# 显示环境变量
ps e -p 1234

示例:

# 查看nginx进程的完整配置
ps -ef | grep nginx

# 输出示例:
# root      1234     1  0 Mar10 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
# www-data  1235  1234  0 Mar10 ?        00:00:00 nginx: worker process

检测僵尸进程:

# 查找僵尸进程
ps aux | grep -w Z
ps -eo pid,stat,cmd | grep -w Z

# 统计僵尸进程数量
ps -eo stat | grep -c Z

清理僵尸进程:

  1. 终止僵尸进程的父进程
  2. 等待父进程回收子进程
  3. 如果父进程是init(1),需要重启系统
# 查找僵尸进程及其父进程
ps -eo pid,ppid,stat,cmd | grep -w Z

# 示例输出:
# 12345 6789 Z   [nginx] 
# 这里12345是僵尸进程,6789是父进程

# 终止父进程(谨慎操作)
kill 6789

# 如果父进程是init(1),僵尸进程会在系统重启后消失
注意:少量的僵尸进程通常不会影响系统性能,但大量僵尸进程可能表示程序有问题。

最佳实践

  1. 掌握常用组合:记住 ps auxps -ef 这两种最常用的格式
  2. 使用grep过滤:结合grep快速查找特定进程,如 ps aux | grep nginx
  3. 排序查看:使用 --sort 选项按资源使用排序,快速找到问题进程
  4. 自定义输出:使用 -o 选项自定义需要显示的字段
  5. 查看完整命令:使用 -fww 查看不截断的完整命令行
  6. 结合其他工具:ps适合脚本处理,top适合实时监控
  7. 理解进程状态:熟悉进程状态码(R、S、D、Z等)的含义
  8. 定期监控:在生产环境中定期检查进程状态
#!/bin/bash
# 实用的ps命令组合

# 1. 查看资源使用最高的进程
alias pscpu='ps aux --sort=-%cpu | head -10'
alias psmem='ps aux --sort=-%mem | head -10'

# 2. 查找进程的简便方法
findp() {
    ps aux | grep -i "$1" | grep -v grep
}

# 3. 显示进程树
alias pst='ps -ef --forest'

# 4. 显示特定用户的进程
psu() {
    ps aux | grep "^$1"
}

# 5. 监控进程变化
watchps() {
    watch -n 2 "ps aux --sort=-%cpu | head -20"
}