pidof 是什么
pidof 按可执行文件名精确查找进程 PID,输出一行或空格分隔的多个 PID。它来自 sysvinit 工具集,语法比 pgrep 更直白:pidof nginx 就能拿到全部同名进程号,脚本里判断「服务在不在」最省事。要注意它匹配的是可执行文件名,而不是完整命令行,这一点决定了它能不能查到你的目标进程。
基本信息
| 所属 | sysvinit-utils(部分系统由 procps-ng 提供兼容实现) |
|---|---|
| 语法 | pidof [-s] [-x] 程序名 |
| 关键选项 | -s 只返回第一个 PID,-x 让脚本匹配脚本自身 |
| 对比工具 | pgrep 支持正则、按用户与完整命令行匹配 |
典型使用场景
- 脚本里快速判断某个服务是否在运行
- 拿到 PID 后发信号:重载配置、触发日志轮转
- 巡检时统计同一程序起了几个实例
- 停止服务前确认进程是否还存在
- 重启前先清理残留进程,避免端口占用
- 定时任务里做占用检查,防止重复启动
常用示例
常用示例
pidof sshd # 列出所有 sshd 进程 PID
pidof -s nginx # 只取第一个 PID
[ -n "$(pidof nginx)" ] && echo running || echo stopped # 最简运行判断
kill -USR1 $(pidof nginx) # 给全部实例发信号(常用于重开日志)
pgrep -f 'python app.py' # 按完整命令行匹配脚本类进程
pgrep -u deploy -f '/opt/app/bin/worker' # 按用户与命令行精确指定
ps -o pid,ppid,stat,cmd -p $(pidof -s nginx) # 拿到 PID 后看状态pidof 与 pgrep 对照
| 需求 | pidof | pgrep |
|---|---|---|
| 按程序名查询 | pidof nginx 直接可用 | pgrep nginx 等价 |
| 按完整命令行 | 不支持 | pgrep -f 指定整行 |
| 按运行用户筛选 | 不支持 | pgrep -u 指定用户 |
| 只取一个结果 | -s 选项 | pgrep -o 或配合 head |
| 匹配脚本进程 | 默认匹配解释器名 | -f 直接匹配整行 |
pidof 匹配的是可执行文件名:以解释器启动的脚本(python app.py、bash job.sh)用程序名查不到,这类进程必须用 pgrep -f 按命令行匹配。
容器使用独立的 PID 命名空间:容器内看到的小 PID 与宿主机视角完全不同,跨命名空间核对 PID 要借助 nsenter 或容器运行时提供的查看方式,否则容易杀错进程。
pidof 返回的多个 PID 是空格分隔的一整行,直接写进 kill 会作用到全部实例;只想操作其中一个时用 -s 或先做过滤。