ps [选项]
-,如 ps -ef-,如 ps aux--,如 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 | 空闲状态 | 内核线程的空闲状态 |
显示当前用户的所有进程:
ps
显示当前用户的进程,包含详细信息:
ps -u
输出示例:
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps
BSD风格(最常用):
ps aux
UNIX风格:
ps -ef
输出字段说明:
USER:进程所有者PID:进程ID%CPU:CPU使用率%MEM:内存使用率VSZ:虚拟内存大小(KB)RSS:物理内存大小(KB)TTY:终端设备STAT:进程状态START:启动时间TIME:累计CPU时间COMMAND:命令名称显示进程的父子关系:
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
按用户筛选:
ps -u root
按PID筛选:
ps -p 1234,5678
按进程名筛选:
ps -C nginx
排除特定进程:
ps -N -C bash
按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
结合watch命令实时监控:
# 每2秒刷新一次
watch -n 2 'ps aux --sort=-%cpu | head -10'
# 监控特定进程
watch -n 1 'ps -p 1234 -o pid,user,%cpu,%mem,cmd'
top 或 htop 命令
分析系统资源使用情况:
#!/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
排查系统问题和异常进程:
# 查找占用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
在脚本中使用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 PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDps -ef(UNIX风格):
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
清理僵尸进程:
# 查找僵尸进程及其父进程
ps -eo pid,ppid,stat,cmd | grep -w Z
# 示例输出:
# 12345 6789 Z [nginx]
# 这里12345是僵尸进程,6789是父进程
# 终止父进程(谨慎操作)
kill 6789
# 如果父进程是init(1),僵尸进程会在系统重启后消失
ps aux 和 ps -ef 这两种最常用的格式ps aux | grep nginx--sort 选项按资源使用排序,快速找到问题进程-o 选项自定义需要显示的字段-f 或 ww 查看不截断的完整命令行#!/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"
}