PS 例程大全
📚 PS 基础语法
复制代码
ps [options]
🔧 常用选项组合
组合
说明
输出内容
ps aux
BSD风格,最常用
所有用户的所有进程
ps -ef
UNIX/标准风格
完整格式列表
ps -eF
扩展完整格式
更多细节
ps -ely
长格式
详细技术信息
ps -ejH
显示进程树
层次结构
ps -eLf
显示线程
LWP(轻量级进程)
📊 输出格式控制
1. 自定义列(-o)
复制代码
# 自定义显示列
ps -eo pid,ppid,cmd,%cpu,%mem,user,tty,start,time
ps -eo pid,comm,args,pcpu,pmem,etime,euid,ruid
# 按指定顺序
ps -o pid,user,comm,cpu,mem -e
# 显示完整命令
ps -eo pid,user,cmd
# 常用列说明:
# pid: 进程ID
# ppid: 父进程ID
# user: 用户名
# comm: 命令名
# cmd: 完整命令
# args: 参数
# %cpu: CPU使用率
# %mem: 内存使用率
# time: 累计CPU时间
# etime: 进程运行时间
# vsz: 虚拟内存大小(KB)
# rss: 物理内存大小(KB)
# tty: 控制终端
# stat: 进程状态
# start: 启动时间
# nice: 优先级
# c: CPU利用率
# sz: 内存页大小
# wchan: 等待通道
2. 排序输出
复制代码
# 按CPU使用率排序(降序)
ps aux --sort=-%cpu
# 按内存使用率排序(降序)
ps aux --sort=-%mem
# 按启动时间排序
ps aux --sort=start
# 按进程ID排序
ps aux --sort=pid
# 多级排序
ps aux --sort=-%cpu,%mem
🎯 进程选择
1. 按用户筛选
复制代码
# 显示指定用户的进程
ps -u root
ps -U www-data
ps -u $(whoami) # 当前用户
ps aux | grep "^username" # 过滤用户(注意^)
# 显示所有用户进程
ps aux
ps -eF
2. 按进程ID筛选
复制代码
# 显示指定PID
ps -p 1234
ps -p 1234,5678
# 显示父进程的所有子进程
ps --ppid 1234
# 显示会话ID的进程
ps -s 4567
3. 按终端筛选
复制代码
# 显示特定终端的进程
ps -t pts/0
ps -t tty1
# 显示有终端的进程
ps -a
ps -at
# 显示所有进程(包括无终端)
ps aux
4. 按命令名筛选
复制代码
# 显示指定命令的进程
ps -C bash
ps -C nginx,apache2
ps -C "python3" -o pid,cmd,user
📈 进程状态详解
1. STAT 状态码
代码
含义
R
运行中或可运行
S
可中断的睡眠
D
不可中断的睡眠(通常IO)
Z
僵尸进程
T
停止状态
t
跟踪/调试中停止
X
死亡(不应该看到)
<
高优先级
N
低优先级
L
有页面被锁定在内存
s
会话领导者
l
多线程
+
前台进程组
2. 状态查看示例
复制代码
# 查看进程状态
ps -eo pid,stat,cmd
# 查找僵尸进程
ps aux | grep 'Z'
ps -eo pid,stat,cmd | grep '^.* Z'
# 查找停止的进程
ps -eo pid,stat,cmd | grep 'T'
# 查看进程优先级
ps -eo pid,nice,cmd
🛠️ 实用例程
1. 系统监控
复制代码
# 查看CPU使用率最高的进程
ps aux --sort=-%cpu | head -10
# 查看内存使用率最高的进程
ps aux --sort=-%mem | head -10
# 查看总进程数
ps aux | wc -l
ps -e --no-headers | wc -l
# 查看每个用户的进程数
ps -eo user | sort | uniq -c | sort -nr
2. 服务管理
复制代码
# 查找服务进程
ps aux | grep nginx
ps -C nginx -o pid,cmd,user,%cpu,%mem
# 查找Java进程
ps aux | grep java
ps -C java -o pid,user,cmd,pcpu,pmem
# 查找Docker容器进程
ps aux | grep docker
# 查找特定端口的进程
ps aux | grep :80
3. 进程树查看
复制代码
# 显示进程树
pstree
pstree -p # 显示PID
pstree -u # 显示用户名
pstree -a # 显示命令行参数
# 用ps显示层次结构
ps -ejH
ps axjf # 显示森林
ps -eo pid,ppid,cmd --forest # 树形结构
# 查看特定进程的树
ps -eo pid,ppid,cmd --forest | grep -A 5 "nginx"
4. 资源分析
复制代码
# 查看进程内存使用详情
ps -eo pid,user,cmd,%mem,rss,vsz,size --sort=-rss | head -20
# 查看进程打开文件数(需要lsof)
ps aux | grep process_name
lsof -p PID | wc -l
# 查看进程启动时间
ps -eo pid,user,cmd,start,etime
# 查看进程运行时间
ps -eo pid,cmd,etime | grep python
🔍 高级诊断
1. 线程查看
复制代码
# 显示线程(LWP)
ps -eLf
ps -T -p PID # 特定进程的线程
ps -L -p PID -o pid,tid,pcpu,cmd
# 线程详细信息
ps -eo pid,lwp,cmd,nlwp,%cpu,%mem | head -20
# 查找多线程进程
ps -eo pid,cmd,nlwp | sort -k3 -nr | head -10
2. 安全相关
复制代码
# 查看进程的真实和有效用户
ps -eo pid,user,euser,ruser,cmd
# 查看进程的真实和有效组
ps -eo pid,group,egroup,rgroup,cmd
# 查看SUID/SGID程序
ps -eo pid,user,group,cmd | grep -E "root|setuid"
# 查看网络相关进程
ps -eo pid,user,cmd | grep -E "(ssh|telnet|ftp)"
3. 性能分析
复制代码
# 查看进程的CPU亲和性
ps -eo pid,cmd,psr # psr = 处理器编号
# 查看进程调度策略
ps -eo pid,cmd,policy # policy: TS=分时, FF=FIFO, RR=轮询
# 查看进程等待的通道
ps -eo pid,cmd,wchan
# 查看进程的信号掩码
ps -eo pid,cmd,blocked,caught,ignored,pending
📋 实用单行命令
1. 系统管理
复制代码
# 杀死僵尸进程
ps aux | awk '$8=="Z" {print $2}' | xargs kill -9
# 清理无用的进程
ps aux | grep defunct | awk '{print $2}' | xargs kill -9
# 查找并杀死特定用户的所有进程
ps -u username -o pid= | xargs kill -9
# 监控进程变化
watch -n 1 'ps aux --sort=-%cpu | head -10'
2. 开发调试
复制代码
# 查看Python进程
ps aux | grep python | grep -v grep
# 查看进程环境变量
ps eww -p PID # 显示环境变量
cat /proc/PID/environ | tr '\0' '\n'
# 查看进程打开的文件
lsof -p PID
ls -la /proc/PID/fd/
# 查看进程内存映射
pmap PID
cat /proc/PID/maps
3. 容器相关
复制代码
# 查看容器进程
ps aux | grep -E "docker|containerd|runc"
# 查看容器内进程
docker exec container_name ps aux
# 查看Kubernetes Pod进程
ps aux | grep -E "kubelet|kube-proxy"
# 查看容器资源使用
docker stats
🎪 组合工具
1. 与 grep 组合
复制代码
# 常用模式:排除grep自身
ps aux | grep [n]ginx # 技巧:[]使grep不匹配自身
ps aux | grep nginx | grep -v grep # 传统方法
# 精确匹配进程名
ps aux | grep "^root.*bash"
# 查找多个进程
ps aux | grep -E "(nginx|apache|mysql)"
# 查找监听端口的进程
ps aux | grep -E ":[0-9]+"
2. 与 awk 组合
复制代码
# 提取特定列
ps aux | awk '{print $1, $2, $11}'
# 统计资源使用
ps aux | awk '{cpu+=$3; mem+=$4} END {print "CPU:", cpu, "MEM:", mem}'
# 按用户统计
ps aux | awk '{users[$1]++} END {for (u in users) print u, users[u]}'
# 过滤特定条件
ps aux | awk '$3 > 10.0 {print $0}' # CPU使用>10%
ps aux | awk '$4 > 1.0 {print $0}' # 内存使用>1%
3. 与 sort 组合
复制代码
# 多级排序
ps aux | sort -k3,3nr -k4,4nr # 先CPU后内存降序
# 按用户分组排序
ps aux | sort -k1,1 -k3,3nr
# 按启动时间排序
ps aux | sort -k9,9
4. 与其他命令组合
复制代码
# 查看进程的完整路径
ps aux | grep process | awk '{print $2}' | xargs ls -l /proc/{}/exe
# 查看进程的cgroup信息
ps aux | grep docker | awk '{print $2}' | xargs -I{} cat /proc/{}/cgroup
# 查看进程的网络连接
ps aux | grep nginx | awk '{print $2}' | xargs -I{} lsof -p {}
📊 输出格式化
1. 人类可读格式
复制代码
# 内存显示为MB/GB
ps aux --sort=-%mem | head -10 | awk '{printf "%-10s %-10s %-8s %-8s %-8s %-12s %s\n", $1, $2, $3, $4, $5/1024"M", $6/1024"M", $11}'
# 时间格式化
ps -eo pid,user,cmd,etime --sort=etime | head -10
# 创建自定义报告
ps -eo pid,user,pcpu,pmem,vsz,rss,tty,stat,start,time,cmd --sort=-pcpu | head -20
2. JSON/XML 输出
复制代码
# JSON输出(需要新版ps或jq)
ps -eo pid,user,cmd --format=json | jq .
# CSV输出
ps -eo pid,user,pcpu,pmem,cmd --no-headers --format=csv
# 自定义分隔符
ps -eo pid,user,cmd --no-headers -o pid,user,cmd --separator='|'
🔧 系统诊断脚本
1. 进程监控脚本
复制代码
#!/bin/bash
# monitor_process.sh
INTERVAL=2
COUNT=10
echo "监控进程资源使用情况"
echo "====================="
for ((i=1; i<=COUNT; i++))
do
echo -e "\n轮次 $i - $(date '+%H:%M:%S')"
echo "CPU前5:"
ps aux --sort=-%cpu | head -6
echo -e "\n内存前5:"
ps aux --sort=-%mem | head -6
sleep $INTERVAL
done
2. 进程分析脚本
复制代码
#!/bin/bash
# analyze_process.sh
PID=$1
if [ -z "$PID" ]; then
echo "用法: $0 <PID>"
exit 1
fi
if [ ! -d "/proc/$PID" ]; then
echo "进程 $PID 不存在"
exit 1
fi
echo "=== 进程 $PID 分析报告 ==="
echo "1. 基本信息:"
ps -p $PID -o pid,ppid,user,group,cmd,start,etime
echo -e "\n2. 资源使用:"
ps -p $PID -o pcpu,pmem,vsz,rss,time
echo -e "\n3. 状态信息:"
cat /proc/$PID/status | grep -E "State|Vm|Threads"
echo -e "\n4. 打开文件数:"
ls -l /proc/$PID/fd 2>/dev/null | wc -l
echo -e "\n5. 内存映射:"
pmap $PID | tail -1
3. 僵尸进程清理脚本
复制代码
#!/bin/bash
# clean_zombies.sh
echo "查找僵尸进程..."
ZOMBIES=$(ps aux | awk '$8=="Z" {print $2}' | tr '\n' ' ')
if [ -z "$ZOMBIES" ]; then
echo "没有找到僵尸进程"
exit 0
fi
echo "找到僵尸进程: $ZOMBIES"
echo "尝试清理..."
for PID in $ZOMBIES; do
PARENT=$(ps -o ppid= -p $PID)
echo "僵尸进程 $PID (父进程 $PARENT)"
# 尝试杀死父进程
if [ ! -z "$PARENT" ]; then
echo " 发送SIGCHLD给父进程 $PARENT"
kill -s SIGCHLD $PARENT 2>/dev/null
# 检查是否清理成功
sleep 1
if ps -p $PID > /dev/null 2>&1; then
echo " ❌ 进程 $PID 仍然存在"
else
echo " ✅ 进程 $PID 已清理"
fi
fi
done
echo "清理完成"
⚠️ 注意事项
1. 权限问题
复制代码
# 普通用户只能看到自己的进程
ps -u $USER
# root可以看到所有进程
sudo ps aux
# 查看其他用户的进程需要权限
sudo ps -u otheruser
2. 性能考虑
复制代码
# 避免频繁执行ps aux(消耗资源)
# 使用top/htop实时监控更好
# 对于大量进程,指定列提高性能
ps -eo pid,cmd,pcpu
# 使用/proc文件系统获取信息更快
cat /proc/1234/status
3. 兼容性问题
复制代码
# Linux vs BSD选项差异
ps aux # Linux/BSD通用
ps -ef # UNIX标准
ps -eF # 扩展格式
# 不同系统的输出可能不同
uname -a # 先查看系统信息
📖 速查表
常用列说明
列名
说明
示例命令
pid
进程ID
ps -eo pid,cmd
ppid
父进程ID
ps -eo pid,ppid,cmd
user
用户名
ps -eo user,pid,cmd
group
组名
ps -eo group,pid,cmd
%cpu
CPU使用率
ps -eo pid,cmd,%cpu
%mem
内存使用率
ps -eo pid,cmd,%mem
vsz
虚拟内存大小(KB)
ps -eo pid,cmd,vsz
rss
物理内存大小(KB)
ps -eo pid,cmd,rss
tty
控制终端
ps -eo pid,cmd,tty
stat
进程状态
ps -eo pid,cmd,stat
start
启动时间
ps -eo pid,cmd,start
time
累计CPU时间
ps -eo pid,cmd,time
etime
运行时间
ps -eo pid,cmd,etime
cmd
完整命令
ps -eo pid,cmd
comm
命令名
ps -eo pid,comm
args
命令参数
ps -eo pid,args
nice
优先级
ps -eo pid,cmd,nice
pri
调度优先级
ps -eo pid,cmd,pri
psr
处理器编号
ps -eo pid,cmd,psr
状态码速查
状态
含义
常见场景
R
运行/可运行
正在执行或等待CPU
S
可中断睡眠
等待事件完成
D
不可中断睡眠
磁盘IO,不可被信号中断
Z
僵尸
进程已结束但父进程未回收
T
停止
被作业控制信号停止
t
跟踪停止
被调试器暂停
X
死亡
进程完全终止
<
高优先级
优先级<0
N
低优先级
优先级>0
L
页面锁定
内存页被锁定
s
会话领导者
进程是会话首进程
l
多线程
进程是多线程的
+
前台进程
在终端前台运行
这个大全涵盖了 ps 命令的绝大多数用法,从基础查询到高级诊断都有示例。掌握这些例程,你就能高效地管理和监控系统进程!