pkill 是什么
pkill 与 pgrep 出自同一套匹配逻辑(procps-ng):pgrep 把命中的进程列出来,pkill 直接把信号发过去。默认匹配进程名(内核里的 comm,最长 15 个字符),加 -f 则匹配完整命令行。它不做任何交互确认,命中即发信号,所以正确用法是「先用 pgrep 同参数预览命中列表,再执行 pkill」。
基本信息
| 适用平台 | Linux(procps-ng;多数发行版自带) |
|---|---|
| 命令语法 | pkill [选项] 模式 |
| 匹配范围 | 默认匹配进程名;-f 匹配完整命令行;-x 要求全字相等;-u 限定属主 |
| 常用信号 | 默认 -TERM(15) 请求退出;-9(SIGKILL) 强杀;-HUP 常用于让守护进程重载配置 |
| 退出码 | 0 至少命中一个进程 / 1 未命中 / 2 语法错误 / 3 致命错误 |
| 安全习惯 | 先 pgrep -af 用同参数预览,确认无误再原样换成 pkill |
典型使用场景
- 批量重启同类进程:pkill 后由守护进程或脚本重新拉起
- 清理跑飞的调试进程:用 -u 限定用户,避免误伤他人进程
- 让服务重载配置:发 -HUP,但支持重载的才可用,正规做法仍是 reload
- 任务收尾:批处理结束后清理遗留的 curl、python 子进程
- 发布脚本里收口:先停旧进程、确认退出、再启新版本
常用示例
常用示例
pgrep -af 'node worker' # 1. 先预览命中列表(-a 显示完整命令行)
pkill -f 'node worker' # 2. 确认无误后执行,默认发 TERM
pkill -u deploy -f 'python app' # 限定属主,缩小误伤范围
pkill -e -f 'ab-test' # -e 打印实际被杀的进程,便于留痕
pkill -x nginx # -x 全字匹配进程名,避免误伤同名变体
pkill -HUP -f 'myapp' # 发 HUP 让进程重载配置(是否支持取决于程序)
pgrep -af -u deploy 'python' # 复查是否还有残留常用选项与匹配对象
| 选项 | 匹配对象 | 注意 |
|---|---|---|
| (默认) | 进程名 comm,最长 15 字符 | 名字被截断时同名进程会被一起命中,建议改用 -f |
| -f | 完整命令行,含全部参数 | 会匹配到命令行里含同串的 shell 或 ssh 自身,有自杀风险 |
| -x | 要求模式与目标完全相等 | 限制误伤最有效,常与 -f 组合使用 |
| -u 用户 | 限定进程属主 | 多用户机器上必加 |
| -e | 输出被杀进程的 pid 与名称 | 脚本日志留痕用 |
pkill -f 的模式会匹配到「正在执行这条命令的 shell 自身」——它的命令行里同样包含这个字符串,存在自杀风险,在 SSH 会话里尤其明显。预览步骤不能省,必要时加 -x 或把模式写得足够独特。
pkill 只负责发信号,不等待进程退出。脚本里「杀掉后立刻重启」必须轮询确认进程确实消失(pgrep 返回 1),否则可能出现两个实例同时抢端口或锁文件。