返回 Bug 清单
BUG-0197project-28中已修复deploy-script
pgrep -f 匹配到脚本自身 —— 清理脚本把自己杀了
发现:2026-09-30验证:2026-10-09置信度:95%
症状
写了一个清理卡住的 certbot 实例的脚本 _clear_certbot.sh,用 for pid in $(pgrep -f 'certbot') 遍历并 kill。脚本运行到该处立即中断。ps 显示被匹配到的两个『certbot 进程』其实是 `bash <script>` —— 因为脚本【文件名里含 certbot】。
根因
pgrep -f 匹配的是【完整命令行】,而脚本自身的命令行包含脚本路径,路径里含目标关键词时就会自匹配。清理类脚本尤其容易踩。
修复方案
1) 用精确匹配可执行名:pgrep -x <name>(匹配 comm,不含参数);
2) 或显式排除自身与父进程:pgrep -f pat | grep -vx "$$" | grep -vx "$PPID";
3) 或从 ps 输出按 comm 过滤:ps -eo pid,comm | awk '$2=="<name>"{print $1}';
4) 给清理脚本命名时避开目标关键词,降低误伤概率。
检测命令
pgrep -af '<pattern>' # 先看会匹配到谁,再决定要不要 kill修复命令
ps -eo pid,comm | awk '$2=="certbot"{print $1}' | xargs -r kill -TERM错误签名
清理脚本执行到 kill 阶段即中断,exit code 1;ps 显示『目标进程』就是脚本本身技术信息
来源项目
project-28
标签
pgrep, self-match, shell, process-management