【linux ps命令的高级用法】

一、高级进程筛选

1. 按资源占用筛选

查找CPU占用率超过10%的进程:

ps aux --sort=-%cpu | awk '$3 > 10 {print $0}'

查找内存占用最大的前5个进程:

ps aux --sort=-%mem | head -n 6 | tail -n 5
2. 按进程状态筛选

查找所有僵尸进程(状态为Z):

ps aux | awk '$8 == "Z" {print $0}'

查找所有睡眠状态(S)的进程:

ps aux | awk '$8 ~ /^S/ {print $0}'
3. 按进程组或会话筛选

显示属于会话ID(SID)为1234的所有进程:

ps -o pid,user,cmd -g 1234

二、进程树与层级关系

1. 以树形结构显示进程
ps -ejH    # 显示完整的进程层级结构
ps axjf    # 显示进程树(BSD风格)
2. 查看特定进程的子进程

显示PID为1234的所有子进程:

ps --ppid 1234 -o pid,cmd
3. 高亮显示当前进程链
ps -o pid,ppid,cmd --forest | grep --color=auto "$$\|$PPID"

三、实时监控与动态更新

1. 使用watch命令动态刷新ps输出

每2秒刷新一次内存占用最高的进程:

watch -n 2 'ps aux --sort=-%mem | head -n 10'
2. 结合while循环持续监控特定进程

监控PID为1234的进程状态变化:

while true; do ps -p 1234 -o pid,user,%cpu,%mem,stat,cmd; sleep 1; done

四、进程资源消耗分析

1. 显示进程打开的文件数
ps -eo pid,user,comm,nlwp | sort -k4 -nr | head  # nlwp列表示线程数
2. 查看进程的内存映射
ps -p 1234 -o pid,vsz,rss,args  # 显示虚拟内存、物理内存使用

五、高级格式化输出

1. 自定义输出字段

显示PID、用户、CPU、内存、启动时间和命令:

ps -eo pid,user,%cpu,%mem,lstart,cmd
2. 格式化输出(对齐、颜色)
ps -eo pid,user,%cpu,%mem,args --sort=-%cpu | column -t | head -n 10

六、进程信号与控制

1. 向进程发送信号

向PID为1234的进程发送SIGUSR1信号:

ps -p 1234 -o pid= | xargs kill -USR1
2. 批量终止进程

终止所有用户testuser的进程:

ps -u testuser -o pid= | xargs kill -9

七、与其他工具组合使用

1. 统计每个用户的进程数
ps -eo user | sort | uniq -c | sort -nr
2. 查找占用特定端口的进程
lsof -i :8080 | awk 'NR>1 {print $2}' | xargs ps -p

八、性能优化技巧

1. 快速查找进程
pgrep -lf "apache2"  # 等价于 ps aux | grep apache2
2. 进程资源使用汇总
ps -eo user,%cpu,%mem --no-headers | awk '{u[$1]+=$2; m[$1]+=$3} END {for(i in u) print i, u[i], m[i]}' | sort -k2 -nr

九、特殊场景应用

1. 追踪进程的父进程链
pstree -p 1234  # 显示PID 1234的完整父进程链
2. 监控进程启动时间
ps -p 1234 -o lstart=

十、常见问题排查

1. 查找消耗CPU时间最长的进程
ps -eo pid,user,%cpu,etime,cmd --sort=-etime | head
2. 排查僵尸进程
ps aux | grep defunct

总结

ps命令配合其他工具(如awkgrepxargs)可以实现强大的进程监控和分析功能。熟练掌握这些技巧能帮助你快速定位系统瓶颈、排查问题进程,以及优化资源分配。

如果需要更高级的实时监控,可以考虑使用tophtopatopglances等工具。