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

相关推荐
源宇宙十三站2 小时前
Linux故障诊断系列2.3-诊断系统启动问题-Server启动失败该如何处理
linux
橘子真甜~3 小时前
C/C++ Linux网络编程13 - 传输层TCP协议详解(面向字节流和有连接)
linux·运维·服务器·c语言·网络·c++·tcp/ip
嘻哈baby3 小时前
systemd服务管理深入实践从入门到自定义服务
linux·服务器·网络
June`3 小时前
SSH连接原理与守护进程实战
linux·运维·服务器
水天需0103 小时前
Grep 例程大全
linux
杼蛘3 小时前
XXL-Job工具使用操作记录
linux·windows·python·jdk·kettle·xxl-job
CQ_YM4 小时前
Linux进程基础
linux·服务器·进程
_OP_CHEN4 小时前
【Git原理与使用】(五)Git 多人协作:从分支协作到冲突解决,团队开发效率翻倍秘籍
linux·运维·git·团队开发·运维开发·企业级组件·git多人协作
添砖java‘’4 小时前
常见的进程间通信方式详解
linux·c++·操作系统·信息与通信·进程通信