一、高危进程批量精准熔断:避免“自杀式”匹配
在微服务批量升级、自动化测试清理或僵死进程排障时,我们经常需要杀掉所有包含某个特定名字的进程(例如 worker_service.py)。
很多工程师习惯写出如下危险命令:
# 🔴 脆弱写法:
ps -ef | grep worker_service.py | awk '{print $2}' | xargs kill -9产生的严重 Bug:
执行此命令时,grep worker_service.py 进程本身也会出现在 ps 输出中!如果运行速度够快,awk 会把 grep 自己的 PID 提取出来,导致脚本还没杀完目标进程就先把自己杀死了。
✅ 优雅解决方案:正则中括号巧避匹配
# 利用中括号正则:[w]orker 会匹配目标命令,但 grep [w]orker 本身不包含字符 "worker"
ps -ef | grep '[w]orker_service.py' | awk '{print $2}' | xargs -r kill -9[w]orker_service.py:进程树中运行的脚本名字叫worker_service.py,符合该正则;但当前排查命令在进程树中显示为grep [w]orker_service.py,无法匹配它自身,完美过滤!xargs -r(即--no-run-if-empty):如果前面没有匹配到任何运行中的进程,xargs直接退出,绝不空传参数去误杀其他进程。
二、秒级清空百万级小文件:为什么不能裸用 rm -rf?
当测试框架生成了海量的日志碎片、或者缓存目录积压了上百万个几 KB 的零碎小文件时,直接执行 rm -rf /opt/cache/* 会立刻遭遇崩溃:
-bash: /bin/rm: Argument list too long即使用 rm -rf /opt/cache/ 不带通配符,由于 EXT4 / XFS 文件系统对海量目录项(dentry)与索引节点(inode)的删除是一条条同步解除引用的,会导致磁盘 iowait 瞬间飙升至 100%,系统完全卡死数小时。
✅ 终极秒级方案:利用 Rsync 目录镜像置空
rsync 是通过对比空目录项直接在内核层批量清空,速度比 rm 快数十倍:
# 1. 建立一个临时空目录
mkdir -p /tmp/empty_dir/
# 2. 利用 --delete 镜像特性,用空目录极速重置目标目录(注意结尾斜杠)
rsync -a --delete --force /tmp/empty_dir/ /opt/huge_cache_dir/
# 3. 清理完毕后移除临时目录
rmdir /tmp/empty_dir/即便目录下堆积了数百万个散碎小文件,通常在几十秒内即可彻底清空,且对磁盘 I/O 冲击极小。
三、生产流量无感排查:tcpdump 抓包实战
当接口测试遇到偶发性握手失败、网关断流或报文解析乱码时,在 Linux 服务器现场抓取物理报文是唯一具有法律证据级别的排障手段。
1. 抓取指定端口并转储为 Wireshark 格式
# -i any: 监听所有网卡接口
# -nn: 直接显示 IP 与端口,不进行耗时的 DNS 逆向域名解析
# -s0: 抓取完整报文,不截断数据包
# -w: 保存为标准 pcap 文件,供下载到本地用 Wireshark 图形化深入分析
tcpdump -i any -nn -s0 port 31000 -w /tmp/capture_service.pcap2. 现场终端直接透视 HTTP 请求明文(-A)
在排查接口传参时,使用 -A 参数可以直接以 ASCII 明文方式将应用层报文打印在终端屏幕上:
# 抓取 8080 端口的前 100 个 HTTP 报文并以 ASCII 输出
tcpdump -i eth0 -nn -A -c 100 'tcp port 8080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12:2]&0xf0)>>2)) != 0)'四、排查“磁盘空间满了,但找不到大文件”(已删除句柄未释放)
有时候执行 df -h 发现根目录或数据盘 100% 爆满,但使用 du -sh /* 算出来的文件总和却只有几 GB。
根因剖析:
某进程正在向大日志文件持续写入,有运维人员直接执行了 rm -f app.log。此时文件的 inode 虽然被标记删除,但由于进程持有的文件描述符(File Descriptor)尚未关闭,磁盘物理块根本不会被释放!
排查与释放:
# 1. 列出所有被删除但仍被进程占用的文件
lsof +L1 | grep deleted
# 2. 根据输出的第二列 PID,优雅重启对应服务释放句柄;
# 3. 紧急情况下,若不能重启服务,可向该文件句柄置空以秒级释放磁盘空间:
# : > /proc/<PID>/fd/<FD_NUM>掌握这些现场应急指令,能够在遭遇线上突发容量报警或网络故障时,临危不乱、秒级解除危机。