PS 例程大全

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 命令的绝大多数用法,从基础查询到高级诊断都有示例。掌握这些例程,你就能高效地管理和监控系统进程!

相关推荐
No8g攻城狮30 分钟前
【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤
linux·运维·ubuntu
XiaoFan0121 小时前
免密批量抓取日志并集中输出
java·linux·服务器
souyuanzhanvip1 小时前
ServerBox v1.0.1316 跨平台 Linux 服务器管理工具
linux·运维·服务器
HalvmånEver2 小时前
Linux:线程互斥
java·linux·运维
番茄灭世神3 小时前
Linux应用编程介绍
linux·嵌入式
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [drivers][mmc][mmc_sdio]
linux·笔记·学习
Forsete3 小时前
LINUX驱动开发#9——定时器
linux·驱动开发·单片机
森G3 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
驱动探索者3 小时前
linux mailbox 学习
linux·学习·算法
酉鬼女又兒4 小时前
每天一个Linux命令_printf
linux·运维·服务器