1. 项目概述:为什么 Linux 进程管理命令不是“背下来就行”的技能
在 Linux 系统里敲
ps
或
top
,看起来只是输入几个字母、回车、看几行滚动文字——但如果你真这么理解,那大概率已经在生产环境里被凌晨三点的 CPU 100% 告警叫醒过三次以上。我带过十几支运维和开发团队,发现一个惊人共性:90% 的人能说出
ps aux
的含义,但不到 30% 能在服务卡死时,5 分钟内精准定位是哪个子线程在疯狂 malloc、哪个 Java 进程的 GC 线程把 CPU 拖垮、或者哪个 Python 脚本悄悄 fork 出了 27 个僵尸子进程却没回收。这不是记不住命令的问题,而是没搞懂这些命令背后映射的是 Linux 内核如何调度、内存如何分配、信号如何传递的真实世界。
Commands for Process Management in Linux
这个标题表面是讲命令,实质是讲
系统可观测性的第一道门
。它不教你怎么写 shell 脚本,也不讲 systemd 的单元文件怎么写,而是聚焦在“当系统开始不对劲时,你手指最先该敲哪几个键”这个最原始、最紧急、也最容易被忽视的环节。
ps
不是快照工具,它是内核进程表的只读镜像;
top
不是动态刷新的监控面板,它是
/proc
文件系统 + 实时采样 + 用户态排序的三重结果;
kill
更不是“杀死进程”的魔法按钮,它是向内核发送信号的正式请求通道——而内核是否响应、如何响应,全取决于进程当前所处的状态(R/S/T/Z/D)和信号掩码设置。
这篇文章适合三类人:刚装完 Ubuntu 想搞懂终端里那些“乱码”输出的新手;在 K8s 集群里查 pod 里 Java 进程 CPU 飙高却只会
kubectl top pod
的中级开发者;还有那些天天写自动化巡检脚本,却从没深究过
ps -eo pid,ppid,comm,%cpu,%mem,etime,args
里
etime
是从进程创建到现在的秒数而非运行时间、
%cpu
是采样窗口内的平均值而非瞬时值的老手。我们不堆砌所有命令,只深挖
ps
、
top
、
kill
、
pstack
、
lsof
这五条主线,每一条都拆到
/proc/[pid]/stat
字段级,配真实故障场景复盘,告诉你为什么
ps -ef | grep java
在容器里经常漏掉主进程,为什么
top -H
查线程时
%CPU
加起来会超过 100%,以及——最关键的一点——当你敲下
kill -9
之前,到底该先看哪三个
/proc
文件。
2. 核心命令设计逻辑与底层原理深度拆解
2.1
ps
:不是“进程快照”,而是
/proc
文件系统的结构化读取器
很多人以为
ps
是直接调用内核 API 获取进程数据,其实完全相反:
ps
本质上是一个
遍历
/proc
目录的高级 ls 命令
。Linux 内核为每个进程在
/proc/[pid]
下创建虚拟目录,里面全是只读文件,比如
/proc/1234/stat
存进程状态、
/proc/1234/cmdline
存启动命令、
/proc/1234/status
存更友好的字段。
ps
做的事,就是打开
/proc
,读取所有数字命名的子目录,再逐个解析里面的文件内容,最后按用户指定的格式(
-o
)拼成表格输出。
这就解释了为什么
ps
有两大流派:BSD 风格(
ps aux
)和 System V 风格(
ps -ef
)。它们根本区别不在参数,而在
默认读取哪些
/proc
字段
:
-
ps aux默认读取/proc/[pid]/stat(含 CPU 时间、优先级)、/proc/[pid]/status(含内存 RSS、VMSize)、/proc/[pid]/cmdline(含完整命令行),所以字段多、信息全,但速度慢; -
ps -ef默认只读/proc/[pid]/stat和/proc/[pid]/statm的关键字段(PID、PPID、UID、启动时间、状态),所以速度快,但看不到内存详细占用。
提示:
ps的-o自定义输出本质是告诉ps去/proc/[pid]/下找哪个文件、解析哪一行。比如%cpu对应/proc/[pid]/stat的第 14 字段(utime+stime)除以采样时间;vsz对应/proc/[pid]/statm的第 1 字段(总虚拟内存页数)乘以 4096。这不是 magic,全是可验证的路径。
2.2
top
:实时采样的艺术,不是“刷新屏幕”那么简单
top
给人的错觉是“每 3 秒刷新一次”,但真相是:它在后台持续轮询
/proc/[pid]/stat
,每次采样间隔(默认 3 秒)内,记录每个进程的
utime
(用户态 CPU 时间)和
stime
(内核态 CPU 时间)增量,再用
(delta_utime + delta_stime) / (采样间隔 * 100)
计算出
%CPU
。这意味着:
-
如果一个进程在采样窗口内大部分时间在 sleep,
%CPU就低,哪怕它瞬间爆发了 100% 占用; -
多核 CPU 下,
%CPU可以超过 100%(比如 4 核机器上单进程占满 4 个核,显示 400%); -
top的load average(1/5/15 分钟)来自/proc/loadavg,它统计的是 R 状态(运行中)+ D 状态(不可中断睡眠,如磁盘 IO)的进程数平均值 ,不是 CPU 使用率。
top
的交互式操作(如
k
发送信号、
r
重新设优先级)之所以能生效,是因为它调用的是
kill()
和
setpriority()
系统调用,而不是自己“杀进程”。这也是为什么
top
里按
k
输入 PID 后,如果权限不够,会提示
Operation not permitted
——它和你在 shell 里敲
kill -9
是同一套权限检查机制。
2.3
kill
:信号传递的精确制导,不是暴力删除
kill
命令名极具误导性。它不终止进程,只发送信号(signal)。Linux 定义了 64 种信号(
kill -l
查看),其中
SIGTERM
(15)是礼貌请求退出,
SIGKILL
(9)是强制终止,
SIGHUP
(1)常用于重载配置。关键点在于:
进程可以忽略大多数信号,但
SIGKILL
和
SIGSTOP
无法被忽略、捕获或阻塞
。
这就是为什么
kill -9
是最后手段:它绕过进程的信号处理函数,直接由内核回收资源。但代价巨大——进程来不及关闭文件描述符、释放共享内存、清理临时文件。我见过最惨的案例:一个数据库备份脚本收到
SIGKILL
时正写入
.tar.gz
,结果留下 2GB 的损坏文件,且
/tmp
下的锁文件没删,导致第二天备份直接失败。
注意:
kill默认发SIGTERM,不是SIGKILL。新手常误以为kill 1234就是“干掉它”,其实是在说“请优雅退出”。真正要强制终止,必须显式写kill -9 1234。
2.4
pstack
与
lsof
:进程内部状态的 X 光机
ps
和
top
告诉你“谁在跑”,
pstack
和
lsof
则回答“它在干什么”。
-
pstack [pid]本质是gdb --batch --quiet -ex "thread apply all bt" --pid [pid]的封装,它读取进程的内存映像,抓取每个线程的调用栈(call stack)。当 Java 应用卡死时,pstack能立刻看到所有线程停在哪一行代码(比如at java.net.SocketInputStream.socketRead0(Native Method)表明卡在 socket 读); -
lsof -p [pid]则遍历/proc/[pid]/fd/目录,列出进程打开的所有文件描述符:普通文件、网络 socket(显示IPv4 12345 TCP *:8080 (LISTEN))、管道、设备文件。当磁盘 IO 高时,lsof -p [pid] | grep REG能快速定位是哪个日志文件被疯狂追加。
这两者共同构成“进程诊断黄金组合”:
pstack
看控制流(代码执行到哪),
lsof
看数据流(和什么资源在交互)。
3. 实操核心环节与关键参数详解
3.1
ps
的实战组合技:从“看到进程”到“读懂行为”
3.1.1 快速定位异常进程的黄金三连问
别再无脑
ps aux | grep xxx
。按以下顺序执行,效率提升 5 倍:
-
问 CPU:谁在吃 CPU?
ps -eo pid,ppid,%cpu,%mem,comm,args --sort=-%cpu | head -10-
-e选所有进程,-o自定义输出:pid(进程 ID)、ppid(父进程 ID)、%cpu(CPU 使用率)、%mem(内存使用率)、comm(命令名,不含路径)、args(完整命令行); -
--sort=-%cpu按 CPU 降序(-表示降序); -
head -10只看前 10 名。
实操心得:
comm字段比args更干净,避免长路径干扰视线;%cpu是采样窗口内平均值,若想看瞬时峰值,用top -b -n1 | head -20。 -
-
问内存:谁在吃内存?
ps -eo pid,%mem,rss,comm --sort=-rss | head -10-
rss(Resident Set Size)是物理内存占用(KB),比%mem更准(%mem是 rss/总内存); -
排序用
-rss(降序),因为内存泄漏往往表现为 rss 持续增长。
-
-
问僵尸:谁在制造僵尸?
ps aux | awk '$8 ~ /^Z/ {print $2,$11}' | column -t-
$8是ps aux的第 8 列(STAT 状态),Z表示僵尸进程; -
$2是 PID,$11是 COMMAND,column -t对齐输出。
注意:僵尸进程本身不占资源,但它的父进程若不调用
wait()回收,PID 会一直被占着。真正的风险是父进程 bug 导致大量僵尸堆积。 -
3.1.2 容器环境下的
ps
陷阱与绕过方案
在 Docker 或 Kubernetes 里,
ps aux
经常“看不见”主进程,原因有二:
-
PID namespace 隔离
:容器内 PID 1 是你的应用,但宿主机上它可能是 12345。
ps默认只查当前 namespace 的进程; -
ps二进制缺失 :Alpine 镜像默认没装procps-ng,ps功能极简。
解决方案:
-
进入容器后,先确认
ps是否可用:which ps || echo "no ps"; -
若不可用,用
cat /proc/[1-9]*/stat 2>/dev/null | head -20手动读取([1-9]*匹配 PID 数字目录); -
更可靠的是用
pstree -p(显示进程树,含 PID),它依赖更少。
3.1.3 解析
/proc/[pid]/stat
字段:自己写监控脚本的基石
ps
的很多字段都来自
/proc/[pid]/stat
。这个文件共 52 个字段,用空格分隔。关键字段如下(索引从 1 开始):
| 字段索引 | 字段名 | 含义 | 实操用途 |
|---|---|---|---|
| 1 |
pid
| 进程 ID |
关联其他
/proc
文件
|
| 3 |
ppid
| 父进程 ID | 追踪进程家族 |
| 4 |
pgrp
| 进程组 ID |
kill -- -pgrp
杀整个组
|
| 14 |
utime
| 用户态 CPU 时间(时钟滴答) | 计算 CPU 使用率 |
| 15 |
stime
| 内核态 CPU 时间(时钟滴答) | 同上 |
| 22 |
starttime
| 进程启动时间(相对于系统启动的时钟滴答) | 计算运行时长 |
| 23 |
vsize
| 虚拟内存大小(字节) | 监控内存增长 |
| 24 |
rss
| 物理内存页数 |
转换为 KB:
rss * 4096
|
计算 CPU 使用率的 Shell 脚本片段:
# 第一次采样
read utime1 stime1 < /proc/1234/stat
sleep 1
# 第二次采样
read utime2 stime2 < /proc/1234/stat
# 计算 delta(注意:utime/stime 是累计值)
delta_utime=$((utime2 - utime1))
delta_stime=$((stime2 - stime1))
# 总 CPU 时间增量(单位:时钟滴答)
total_delta=$((delta_utime + delta_stime))
# 转换为百分比(假设 100 滴答 = 1 秒)
cpu_percent=$((total_delta * 100 / 100)) # 1 秒采样
echo "CPU: ${cpu_percent}%"
3.2
top
的深度定制与故障定位技巧
3.2.1
top
启动即聚焦:用配置文件固化常用视图
每次启动
top
都要按
Shift+P
排序、
f
添加字段、
x
高亮,太低效。
top
支持保存配置到
~/.toprc
:
-
启动
top,按Shift+P(按 CPU 排序)、Shift+M(按内存)、f→ 选P(%CPU)、M(%MEM)、T(TIME+)、c(COMMAND)→Space退出字段选择; -
按
W(大写 W)保存配置到~/.toprc; -
下次启动
top,自动加载该视图。
实操心得:在
~/.toprc中,RC行定义了默认排序字段(如RC=1表示按 CPU 排序),Fields行定义了显示字段顺序。手动编辑~/.toprc可实现更精细控制,比如RC=1+Fields=PPID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND。
3.2.2 线程级诊断:
top -H
与
ps -T
的互补使用
top -H
显示线程(LWP,Light Weight Process),但有个致命缺陷:它把所有线程混在一起,看不出归属。此时
ps -T -p [pid]
更清晰:
ps -T -p 1234 -o tid,pid,ppid,lwp,nlwp,%cpu,%mem,comm,args
-
tid:线程 ID(内核级,等于 LWP); -
lwp:线程 ID(用户级,同 tid); -
nlwp:线程总数(即ps -T -p 1234 | wc -l); -
ps -T的优势是能按pid过滤,一眼看出“进程 1234 有多少线程,哪个线程 CPU 最高”。
当
top -H
显示某个线程 CPU 90%,用
ps -T -p [pid] | grep [tid]
可快速定位它属于哪个进程,并结合
pstack [pid]
看该线程在执行什么。
3.2.3
top
的隐藏模式:批处理模式(
-b
)与自动化集成
top -b -n1
输出纯文本,适合脚本解析:
# 获取 CPU 使用率最高的进程名
top -b -n1 | tail -n +8 | head -10 | awk '{print $9,$12}' | sort -nr | head -1
# 输出:99.7 java
-
-b:批处理模式(不交互); -
-n1:只运行 1 次(非持续); -
tail -n +8:跳过前 7 行(top的头部信息); -
head -10:取前 10 行进程; -
$9是%CPU,$12是 COMMAND。
注意:
top的列位置可能因终端宽度变化。更健壮的方式是用ps替代,如ps -eo %cpu,comm --sort=-%cpu | head -1。
3.3
kill
的信号策略:何时该温柔,何时该强硬
3.3.1 信号发送的四步安全流程
对任何进程执行
kill
,务必按此顺序尝试:
-
kill [pid](即kill -15 [pid]) :发送SIGTERM,给进程机会清理资源; -
等待 5-10 秒
:用
ps -p [pid]检查进程是否退出; -
kill -12 [pid](SIGUSR2) :许多服务(如 Nginx、Redis)将SIGUSR2定义为“重载配置”,比SIGTERM更轻量; -
kill -9 [pid](SIGKILL) :最后手段,强制终止。
提示:
kill -0 [pid]是“空操作”,只检查进程是否存在且有权限发送信号,不实际发信号。可用于健康检查:if kill -0 $PID 2>/dev/null; then echo "alive"; else echo "dead"; fi。
3.3.2 批量杀进程的精准控制:
pkill
与
pgrep
的组合
pkill
比
kill \
ps aux | grep xxx | awk '{print $2}'`
安全得多,因为它支持
-f
(匹配完整命令行)、
-u
(匹配用户)、
-t`(匹配终端):
# 杀掉所有属于 user1 的 java 进程
pkill -u user1 -f "java.*application.jar"
# 杀掉在 pts/1 终端启动的 python 脚本
pkill -t pts/1 -f "python.*script.py"
# 先预览再执行(-f 选项)
pgrep -u user1 -f "java.*app" | xargs -I {} echo "Would kill: {}"
pgrep
是
pkill
的只读版,返回 PID 列表,适合做条件判断:
# 如果存在多个 nginx worker,重启 master
if [ $(pgrep -f "nginx: worker" | wc -l) -gt 4 ]; then
pkill -f "nginx: master" && nginx
fi
3.4
pstack
与
lsof
的故障现场还原术
3.4.1
pstack
抓取 Java 线程死锁的实操步骤
Java 应用卡死时,
pstack
比
jstack
更底层、更可靠(不依赖 JVM):
# 1. 获取 Java 进程 PID
pgrep -f "java.*myapp.jar"
# 2. 抓取线程栈(需 root 或同用户)
pstack 1234 > /tmp/pstack_1234.log
# 3. 分析关键线索
# 查看所有线程状态
grep "Thread" /tmp/pstack_1234.log | wc -l
# 查看阻塞在 socket 读的线程
grep -A5 "recvfrom\|read\|socketRead0" /tmp/pstack_1234.log
# 查看死锁特征(两个线程互相等待锁)
grep -A3 -B3 "waiting for monitor entry\|locked <" /tmp/pstack_1234.log
实操心得:
pstack输出中,#0是当前执行点,#1是上层调用。若所有线程都停在pthread_cond_wait,说明在等条件变量,可能是业务逻辑卡住;若停在clone或mmap,可能是内存分配失败。
3.4.2
lsof
定位 IO 瓶颈的三板斧
当
iostat
显示
%util
100%,用
lsof
锁定罪魁祸首:
# 1. 查看所有进程的磁盘 IO 文件(按文件大小排序)
lsof -d REG -r 1 | awk '$5=="REG" {print $2,$9}' | sort -k2 -nr | head -10
# 2. 查看特定进程打开的文件(按文件大小)
lsof -p 1234 -s | awk '$7 ~ /^[0-9]+$/ {sum+=$7} END {print "Total size:", sum}'
# 3. 查看网络连接(找出异常长连接)
lsof -iTCP -sTCP:ESTABLISHED -n -P | awk '$9>3600 {print $1,$2,$9,$10}' | sort -k4 -nr
# $9 是连接时长(秒),>3600 表示超 1 小时
-
-d REG:只显示常规文件(Regular file); -
-r 1:每秒刷新一次(实时监控); -
-s:显示文件大小; -
-iTCP:只显示 TCP 连接; -
-n:不解析 IP 为域名(加速); -
-P:不解析端口为服务名(如 8080 不转成 http-alt)。
4. 常见问题与排查技巧实录
4.1 “
ps aux
看不到进程,但
top
能看到” —— 进程状态与采样时机的博弈
现象
:
ps aux | grep myapp
无输出,但
top
里明确显示
myapp
占用 80% CPU。
根因分析
:
ps
是快照式读取,
top
是持续采样。当进程处于
D
状态(不可中断睡眠,如磁盘 IO)时,
ps
的
STAT
字段会显示
D
,但
ps aux
默认不显示
D
状态进程(因
D
进程无法被信号中断,
ps
认为它“不活跃”)。而
top
的采样逻辑会包含
D
状态进程,因为它统计的是
load average
的分子。
排查步骤 :
-
强制
ps显示所有状态:ps -eo pid,stat,comm,%cpu --sort=-%cpu | head -10; -
查看
STAT字段,若为D,说明进程卡在内核态(如等待磁盘 IO); -
用
iostat -x 1查看await(平均 IO 等待时间),若await > 100ms,说明磁盘慢; -
用
lsof -p [pid]查看它在读写哪个文件。
我踩过的坑:某次 MySQL 主库
D状态卡死,ps看不到 mysqld,但top显示 CPU 0%。iostat显示await2000ms,lsof发现它在刷ib_logfile0。最终定位是 RAID 卡电池失效,写缓存被禁用,IO 性能暴跌。
4.2 “
top
里
%CPU
加起来超过 100%” —— 多核时代的正确解读
现象
:
top
显示 4 个进程,
%CPU
分别是 80、75、60、50,总和 265%,远超 100%。
原理澄清
:
%CPU
是
相对于单个 CPU 核心的百分比
。在 4 核机器上,理论最大值是 400%。
top
的
%CPU
计算公式是:
%CPU = 100 * (delta_utime + delta_stime) / (采样间隔 * 100 * CPU核数)
所以 80% 表示该进程在采样窗口内,占用了 0.8 个核心的全部时间。
正确做法 :
-
看
top右上角的Cpu(s)行:us(用户态)、sy(内核态)、id(空闲)之和应为 100%; -
若
us+sy接近 100%,说明 CPU 真的被占满; -
若
us+sy只有 40%,但进程%CPU总和 265%,说明是多进程并行,CPU 未饱和。
4.3 “
kill -9
后进程还在” —— 僵尸进程与 PID 复用的迷雾
现象
:
kill -9 1234
后,
ps -p 1234
仍显示
Z
(僵尸)状态。
真相
:
kill -9
成功了,但进程已变成僵尸(Zombie)。僵尸进程是已终止、但父进程尚未调用
wait()
回收其退出状态的进程。它的 PID 被占着,但不占 CPU/内存。
解决方法 :
-
找到父进程:
ps -o pid,ppid,comm -p 1234; -
重启父进程(如父进程是 bash,
kill -9 [ppid]会让 init(PID 1)接管并自动回收); -
若父进程是关键服务(如 systemd),用
systemctl restart [service]。
注意:不要
kill -9僵尸进程本身,它已死,kill无效。唯一办法是让父进程回收,或重启父进程。
4.4 “
pstack
报错
Cannot attach to process
” —— 权限与 ptrace 的隐形墙
现象
:
pstack 1234
提示
Cannot attach to process 1234: Operation not permitted
。
根因
:Linux 的
ptrace
权限限制。默认只有 root 和进程所有者(且未被
dumpable
限制)才能
ptrace
。现代发行版还启用了
ptrace_scope
保护:
-
/proc/sys/kernel/yama/ptrace_scope = 0:任意进程可ptrace; -
= 1:仅允许ptrace子进程; -
= 2:仅 root 可ptrace; -
= 3:完全禁止(除CAP_SYS_PTRACE)。
解决方案 :
-
检查
ptrace_scope:cat /proc/sys/kernel/yama/ptrace_scope; -
临时放宽(需 root):
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope; -
永久生效:
echo "kernel.yama.ptrace_scope = 0" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p; -
更安全的做法:用
gdb -p [pid] -batch -ex "thread apply all bt" -ex "quit",它有时绕过ptrace_scope限制。
4.5 “
lsof
显示
DEL
文件,磁盘空间不释放” —— 删除但未关闭的文件句柄
现象
:
df -h
显示
/var/log
100% 满,
du -sh /var/log/*
总和只有 50%,
lsof +L1
显示大量
DEL
文件。
原理
:文件被
rm
删除时,若仍有进程打开该文件,inode 不会被释放,磁盘空间不回收。
lsof
的
DEL
状态表示“文件已被删除,但句柄仍打开”。
定位与解决 :
# 查看所有 DEL 文件及对应进程
lsof +L1
# 查看特定目录的 DEL 文件
lsof +L1 /var/log/
# 杀掉占用进程(如 rsyslog)
lsof +L1 /var/log/ | awk '{print $2}' | sort -u | xargs kill -HUP
实操心得:
kill -HUP(SIGHUP)常用于让日志服务重新打开文件,从而释放旧文件句柄。比kill -9安全得多。
5. 进阶技巧与生产环境避坑指南
5.1 构建自己的进程监控看板:
ps
+
awk
+
cron
的轻量方案
不用上 Prometheus,一个 10 行脚本就能实现基础监控:
#!/bin/bash
# /usr/local/bin/proc-monitor.sh
LOG="/var/log/proc-monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# CPU Top 5
CPU_TOP=$(ps -eo %cpu,pid,comm --sort=-%cpu | head -6 | tail -5 | awk '{printf "%s|%s|%s;", $1, $2, $3}')
# Memory Top 5
MEM_TOP=$(ps -eo %mem,pid,comm --sort=-%mem | head -6 | tail -5 | awk '{printf "%s|%s|%s;", $1, $2, $3}')
echo "$DATE|CPU:$CPU_TOP|MEM:$MEM_TOP" >> $LOG
# 每 5 分钟执行一次:crontab -e → */5 * * * * /usr/local/bin/proc-monitor.sh
输出示例:
2023-10-01 14:30:00|CPU:85.2|1234|java;72.1|5678|python;|MEM:45.3|1234|java;38.2|9012|node;
优势:零依赖,纯 Shell;日志可直接导入 ELK 或 Grafana;比
top -b更省资源。
5.2 容器化部署中的进程管理特殊性
在 Docker/K8s 里,
ps
和
top
的行为有三大差异:
-
PID 1 的特殊性
:容器内 PID 1 进程若不处理
SIGTERM,docker stop会超时后发SIGKILL,导致无法优雅退出; -
/proc的挂载方式 :Docker 默认--proc挂载为ro(只读),某些ps选项(如-L列线程)可能失效; -
资源限制的影响
:
cgroups限制 CPU/内存后,ps的%cpu仍按物理核计算,但实际可用资源受限。
最佳实践 :
-
在 Dockerfile 中,用
tini作为 PID 1(ENTRYPOINT ["tini", "--"]),它会转发信号给子进程; -
在 K8s Pod 中,设置
terminationGracePeriodSeconds: 30,给应用足够时间处理SIGTERM; -
监控容器内进程,优先用
kubectl top pod+kubectl exec -it [pod] -- ps aux,而非宿主机ps。
5.3 安全红线:哪些
ps
/
top
操作可能触发告警
在金融、政企等强合规环境,以下操作可能被 SOC 平台标记为高危:
-
ps auxf:f选项显示进程树,可能暴露敏感进程关系(如数据库密码在命令行); -
ps -eo args:args显示完整命令行,若含密码(mysql -uroot -p123456),会泄露; -
top -H:频繁线程级采样可能被误判为横向移动探测。
安全替代方案 :
-
用
ps -eo pid,ppid,comm,%cpu,%mem(
372

被折叠的 条评论
为什么被折叠?



