ps
ps
(Process Status)命令用于显示当前系统中运行的进程信息,是Linux系统监控和管理进程的基本工具。
基本语法
ps [选项]
主要选项
BSD风格选项(不带前缀-)
a
- 显示所有终端的进程u
- 显示进程的详细信息x
- 显示无终端的进程r
- 只显示正在运行的进程T
- 显示当前终端的进程
UNIX风格选项(带前缀-)
-e
- 显示所有进程-f
- 显示完整的进程信息-l
- 长格式显示-o format
- 自定义输出格式-p pid
- 显示指定PID的进程-u user
- 显示指定用户的进程-C command
- 显示指定命令的进程
GNU风格选项(带前缀--)
--forest
- 以树形格式显示进程--sort column
- 按指定列排序--no-headers
- 不显示标题行
常用组合
最常用的命令组合
# 显示所有进程的详细信息
ps aux
# 显示进程树
ps auxf
ps --forest
# 以完整格式显示所有进程
ps -ef
# 显示进程层次结构
ps -ejH
输出字段含义
ps aux输出字段
USER
- 进程所有者PID
- 进程ID%CPU
- CPU使用百分比%MEM
- 内存使用百分比VSZ
- 虚拟内存大小(KB)RSS
- 物理内存大小(KB)TTY
- 终端类型STAT
- 进程状态START
- 进程启动时间TIME
- CPU使用时间COMMAND
- 命令行
进程状态代码(STAT)
R
- 运行中(Running)S
- 睡眠中(Sleeping)D
- 不可中断睡眠(Uninterruptible sleep)T
- 停止(Stopped)Z
- 僵尸进程(Zombie)<
- 高优先级N
- 低优先级L
- 有页面锁定在内存中s
- 会话领导者l
- 多线程+
- 前台进程组
使用示例
基本查看
# 显示当前用户的进程
ps
# 显示所有进程
ps aux
# 显示完整命令行
ps auxww
# 以树形格式显示
ps auxf
查找特定进程
# 按进程名查找
ps aux | grep nginx
ps -C nginx
# 按用户查找
ps -u root
ps aux | grep "^root"
# 按PID查找
ps -p 1234
ps aux | grep 1234
自定义输出格式
# 只显示PID和命令
ps -eo pid,comm
# 显示进程的CPU和内存使用情况
ps -eo pid,ppid,cmd,%cpu,%mem
# 显示进程的完整信息
ps -eo pid,ppid,user,cmd,state,pri,nice,pcpu,pmem,time
# 显示线程信息
ps -eLf
ps auxm
排序和过滤
# 按CPU使用率排序
ps aux --sort=-%cpu
# 按内存使用率排序
ps aux --sort=-%mem
# 按启动时间排序
ps aux --sort=start_time
# 组合排序(先按CPU,再按内存)
ps aux --sort=-%cpu,-%mem
实际应用场景
系统监控
# 查看系统负载最高的进程
ps aux --sort=-%cpu | head -10
# 查看内存使用最多的进程
ps aux --sort=-%mem | head -10
# 查看运行时间最长的进程
ps -eo pid,cmd,etime --sort=etime | tail -10
# 统计进程状态
ps aux | awk '{print $8}' | sort | uniq -c
进程管理
# 查看指定服务的所有进程
ps aux | grep -E "(apache|httpd|nginx)"
# 查看父子进程关系
ps -ejH
ps auxf | grep -A5 -B5 进程名
# 查看进程的线程
ps -T -p 1234
ps auxm | grep 进程名
故障排查
# 查找僵尸进程
ps aux | grep -E "Z|<defunct>"
# 查找CPU使用率高的进程
ps aux | awk '$3 > 50 {print $0}'
# 查找内存使用率高的进程
ps aux | awk '$4 > 10 {print $0}'
# 查看进程的详细启动信息
ps -fp $(pgrep 进程名)
服务检查
# 检查Web服务器进程
ps aux | grep -E "(apache|httpd|nginx)" | grep -v grep
# 检查数据库进程
ps aux | grep -E "(mysql|postgresql|mongodb)" | grep -v grep
# 检查SSH服务
ps aux | grep sshd | grep -v grep
# 检查系统关键进程
ps -ef | grep -E "(systemd|init|kernel)"
高级用法
进程监控脚本
#!/bin/bash
# process_monitor.sh
echo "=== TOP CPU PROCESSES ==="
ps aux --sort=-%cpu | head -6
echo -e "\n=== TOP MEMORY PROCESSES ==="
ps aux --sort=-%mem | head -6
echo -e "\n=== PROCESS COUNT BY USER ==="
ps aux | awk '{print $1}' | sort | uniq -c | sort -nr
echo -e "\n=== PROCESS STATES ==="
ps aux | awk '{print $8}' | sort | uniq -c
实时进程监控
# 每5秒刷新一次进程信息
watch -n 5 'ps aux --sort=-%cpu | head -20'
# 监控特定进程的资源使用
watch -n 2 'ps -p 1234 -o pid,ppid,cmd,%cpu,%mem,time'
# 监控进程数量变化
watch -n 1 'ps aux | wc -l'
进程分析
# 统计各用户的进程数
ps aux | awk '{print $1}' | sort | uniq -c | sort -nr
# 统计不同状态的进程数
ps aux | awk '{print $8}' | sort | uniq -c
# 查看进程的命令行参数
ps -ww -p PID
# 计算系统总的CPU和内存使用
ps aux | awk '{cpu+=$3; mem+=$4} END {print "Total CPU:", cpu"%", "Total MEM:", mem"%"}'
与其他命令结合
结合kill命令
# 杀死特定名称的所有进程
ps aux | grep process_name | grep -v grep | awk '{print $2}' | xargs kill
# 更简单的方法
pkill process_name
killall process_name
结合管道和过滤
# 查找占用CPU超过50%的进程并显示详细信息
ps aux | awk '$3 > 50' | sort -k3 -nr
# 查看所有Java进程的内存使用情况
ps aux | grep java | awk '{print $2, $4, $11}' | sort -k2 -nr
# 统计apache进程的内存总使用量
ps aux | grep apache | awk '{sum+=$4} END {print "Apache total memory:", sum"%"}'
性能考虑
减少系统开销
# 对于频繁执行的脚本,使用-o选项只获取需要的字段
ps -eo pid,cmd --no-headers
# 避免使用grep过滤ps输出,使用ps的内置过滤
ps -C process_name # 而不是 ps aux | grep process_name
大系统优化
# 在进程很多的系统中,限制输出行数
ps aux | head -100
# 使用pgrep代替ps+grep组合
pgrep -l process_name # 而不是 ps aux | grep process_name
注意事项
- 权限: 普通用户只能看到自己的进程,root可以看到所有进程
- 瞬时快照: ps显示的是执行时刻的进程状态
- 格式差异: 不同Unix系统的ps选项可能不同
- 性能影响: 频繁执行ps命令会消耗系统资源
- 命令行截断: 长命令行可能被截断,使用-ww选项显示完整命令
相关命令
top
- 动态显示进程信息htop
- 交互式进程查看器pstree
- 以树形格式显示进程pgrep
- 按名称查找进程IDpkill
- 按名称杀死进程jobs
- 显示当前shell的作业
ps命令是Linux系统进程管理的核心工具,掌握其用法对系统监控和故障排查非常重要。