Shell编程中的ps命令使用详解
ps(Process Status)是Linux/Unix系统中最基础且强大的进程查看命令。掌握ps的各种用法对于系统监控、性能分析和故障排查至关重要。本文将全面解析ps命令的使用技巧。
一、基础用法
1.1 最简形式
ps
显示当前终端会话的进程:
PID TTY TIME CMD 1234 pts/0 00:00:00 bash 5678 pts/0 00:00:00 ps
1.2 显示所有进程
ps -e # System V风格ps -A # 同-eps aux # BSD风格(最常用)
二、选项风格详解
ps有三种选项风格,不能混用:
| | |
| BSD | | ps aux |
| System V | | ps -ef |
| GNU | | ps --sort=-%cpu |
注意:ps -aux(带横线)会打印警告,应使用ps aux
三、常用选项组合
3.1 经典组合:ps aux
ps aux | head -5
输出字段含义:
3.2 System V风格:ps -ef
ps -ef | head -5
输出字段:
3.3 长格式输出:ps -efl (BSD: ps lax)
显示更多详细信息,包括优先级(NI)、地址(ADDR)等。
四、进程状态(STAT)代码解读
ps aux | grep sshd
STAT列常见状态:
五、高级筛选技巧
5.1 按用户筛选
ps -u root # 显示root用户的进程ps -u root,www # 多个用户ps -U 1000 # 按UID
5.2 按进程名筛选
ps -C nginx # 显示名为nginx的进程ps -C sshd,bash # 多个进程名# 更灵活的筛选(推荐)ps aux | grep python | grep -v grep
5.3 按PID筛选
ps -p 1234 # 显示PID为1234的进程ps -p 1234,5678 # 多个PIDps --pid 1234 # GNU风格
5.4 反向筛选
ps -N -u root # 显示非root用户的进程
六、自定义输出格式(-o选项)
6.1 常用格式
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
6.2 常用字段列表
ps -eo pid,ppid,cmd,%cpu,%mem,etime,nice,pri,stat
6.3 自定义标题
ps -eo "pid ppid command:50 cpu mem" | head
6.4 按CPU/内存排序
# 按CPU降序ps aux --sort=-%cpu | head -10# 按内存升序ps aux --sort=+%mem | tail -10
七、树形结构显示
7.1 显示进程树
ps axjf # BSD风格ps -ejH # System V风格ps -ef --forest # GNU风格
7.2 查找父进程
ps -p 1234 -o pid,ppid,cmd
7.3 显示线程
ps -eLf # 显示所有线程ps -p 1234 -L # 显示指定进程的线程
八、实际应用场景
8.1 查找并终止僵尸进程
# 查找僵尸进程ps aux | awk '$8=="Z"'# 查找僵尸进程的父进程ps -eo pid,ppid,stat | grep Z
8.2 监控资源消耗
# 每5秒刷新一次CPU前5名watch -n 5 'ps aux --sort=-%cpu | head -6'# 内存使用超过50%的进程ps aux | awk '$4 > 50'
8.3 脚本中常用技巧
# 获取脚本自身PIDecho $$# 检查进程是否存在pgrep -f "myapp" >/dev/null && echo"Running"# 获取进程启动的完整命令行ps -p $PID -o cmd --no-header
8.4 安全审计
# 查看所有网络相关进程ps aux | grep -E 'ssh|nginx|apache'# 查看没有控制终端的进程(可能的后门)ps aux | awk '$7=="?"'
九、输出字段完整参考
| | |
| %cpu | | |
| %mem | | |
| args | | |
| bsdstart | | |
| comm | | |
| cp | | |
| cputime | | |
| egid | | |
| euid | | |
| f | | |
| gid | | |
| pgid | | |
| pid | | |
| ppid | | |
| psr | | |
| rgid | | |
| ruid | | |
| rss | | |
| sgi_p | | |
| size | | |
| start | | |
| start_time | | |
| stat | | |
| sz | | |
| tname | | |
| uid | | |
| uname | | |
| user | | |
| vsz | | |
十、最佳实践与技巧
10.1 别名设置
在.bashrc中添加:
alias psc='ps aux --sort=-%cpu | head -10'alias psm='ps aux --sort=-%mem | head -10'alias pst='ps -ef --forest'
10.2 与grep配合
# 避免grep自身出现ps aux | grep [s]shdps aux | grep sshd | grep -v grep
10.3 性能考虑
# 单次快照使用psps aux# 持续监控使用toptop -b -n 1 # 批处理模式
10.4 与pgrep/pkill配合使用
# 查找进程pgrep -f "python3 myapp.py"# 终止进程pkill -f "python3 myapp.py"
10.5 注意事项
- 1. BSD vs System V: 同一系统上混用可能无效
- 2. 输出截断: 默认命令行可能截断,使用
comm或args控制 - 5. 时间格式: 超过24小时显示为
DD-HH:MM:SS
十一、总结
ps命令虽简单但功能强大,核心记住以下几点:
- 2. 实时监控:
watch 'ps aux --sort=-%cpu' - 3. 自定义输出:
ps -eo pid,ppid,cmd
掌握这些技巧后,结合grep、awk、watch等工具,可以构建强大的系统监控和诊断能力。对于持续监控,建议使用top或htop;对于历史分析,使用ps配合日志记录。