一、生产巡检痛点
当 Linux 节点负载(Load Average)突发飙高或内存触碰 95% 告警红线时,运维与测试人员需要以最快速度回答两个核心问题:
- 当前是谁在狂吃 CPU 和内存?(哪个进程 PID?)
- 这个进程到底是在哪台机器的哪个物理目录下启动的?(它的源码工程和入口是什么?)
很多时候在 ps 中只能看到一个简陋的 python worker.py 或 java -jar app.jar,服务器上往往跑了多个同名服务,根本分不清是测试环境哪个目录下的工程在消耗资源。
二、快速排序提取系统高耗元凶
利用 ps aux 的专用排序参数结合文本切分工具:
1. 提取占用 CPU 最高的 Top 5 进程
bash
# sort -k3nr: 按第 3 列 (%CPU) 倒序数字排序
ps aux | sort -k3nr | head -n 5 | awk '{print $2, $3"%", $11}'2. 提取占用物理内存最高的 Top 5 进程
bash
# sort -k4nr: 按第 4 列 (%MEM) 倒序数字排序
ps aux | sort -k4nr | head -n 5 | awk '{print $2, $4"%", $11}'三、神技:通过 /proc/<PID>/cwd 挖出进程真实家目录
在 Linux 中,每个正在运行的进程在内核虚拟文件系统 /proc/<PID> 下都有一个名为 cwd(Current Working Directory) 的特殊软链接。
这个软链接永远严格指向该进程被启动时所在的原生真实物理路径:
bash
ls -l /proc/19496/cwd
# 输出示例:
# lrwxrwxrwx 1 deployer deployer 0 Sep 4 14:20 /proc/19496/cwd -> /opt/services/order_service_v2/哪怕进程在后台被重命名、或者脚本没有显式打印绝对路径,直接查看 /proc/<PID>/cwd 就能瞬间定位到是哪一份代码在占用资源。
四、生产级一键自动化巡检脚本(Shell)
将上述逻辑封装为一个即插即用、结构清晰的生产排障辅助脚本 inspect_top_resources.sh:
bash
#!/bin/bash
# =================================================================
# 脚本名称: inspect_top_resources.sh
# 作用: 快速透视并打印当前主机 CPU 与内存占用 Top 5 的进程及所在目录
# =================================================================
echo "========================================================="
echo " [主机性能实时巡检] 正在分析高负载进程..."
echo "========================================================="
# 1. 提取内存占用前 5 的 PID 清单
mem_pids=$(ps aux | sort -k4nr | head -n 5 | awk '{print $2}')
echo -e "\n[1] 内存占用 Top 5 进程分析:"
echo "---------------------------------------------------------"
for pid in ${mem_pids}; do
if [ -d "/proc/${pid}" ]; then
cmd_name=$(ps -p ${pid} -o comm= 2>/dev/null)
mem_pct=$(ps -p ${pid} -o %mem= 2>/dev/null)
work_dir=$(ls -ld /proc/${pid}/cwd 2>/dev/null | awk '{print $NF}')
echo "PID: ${pid} | 内存占比: ${mem_pct}% | 进程名: ${cmd_name}"
echo " └─ 实际运行工作目录: ${work_dir}"
fi
done
# 2. 提取 CPU 占用前 5 的 PID 清单
cpu_pids=$(ps aux | sort -k3nr | head -n 5 | awk '{print $2}')
echo -e "\n[2] CPU 占用 Top 5 进程分析:"
echo "---------------------------------------------------------"
for pid in ${cpu_pids}; do
if [ -d "/proc/${pid}" ]; then
cmd_name=$(ps -p ${pid} -o comm= 2>/dev/null)
cpu_pct=$(ps -p ${pid} -o %cpu= 2>/dev/null)
work_dir=$(ls -ld /proc/${pid}/cwd 2>/dev/null | awk '{print $NF}')
echo "PID: ${pid} | CPU占比: ${cpu_pct}% | 进程名: ${cmd_name}"
echo " └─ 实际运行工作目录: ${work_dir}"
fi
done
echo -e "\n========================================================="
echo " 巡检分析完成"
echo "========================================================="使用方式:
bash
chmod +x inspect_top_resources.sh
./inspect_top_resources.sh直接将输出贴入群中或工单系统,一目了然,无需在成千上万个进程中反复大海捞针。