pidof 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
pidof——进程管理命令族(见进程管理与调度命令族)。当你知道程序叫nginx但不知道它 PID 多少、想给它发信号时,pidof 一下就拿到。
pidof 根据可执行文件的名字,返回正在运行的对应进程的 PID(可能不止一个)。
一、基本用法
bash
pidof nginx # 输出所有 nginx 进程的 PID,如 1234 1235 1236
pidof -s nginx # -s 只返回一个(single)PID
pidof sshd # 查 sshd 服务进程默认会列出该名字下所有进程的 PID,空格分隔。多个 worker 进程时就有多个号。
-s在脚本里只想拿"任意一个"时够用。
二、配合 kill 发信号
bash
kill -HUP $(pidof nginx) # 给 nginx 发 HUP(平滑重载配置)
pidof nginx | xargs kill -TERM # 多个 PID 一起杀这是 pidof 最常见的用法:先拿到 PID,再喂给 kill 发信号。平滑重载、优雅停止都靠这招。注意 xargs 会把多个 PID 一次性传给 kill。
三、pidof vs pgrep vs pkill
| 命令 | 特点 |
|---|---|
pidof | 只按可执行名精确匹配,输出 PID |
| pgrep | 支持正则/用户/会话等复杂匹配,输出 PID(见pgrep 命令详解) |
| pkill | 直接按名发信号杀进程,不用先查(见pkill 命令详解) |
简单"按名查 PID"用 pidof 最直白;要按用户/正则筛选用 pgrep;想一步到位"按名杀"用 pkill。pidof 不能筛选,这是它的局限。
四、踩坑:同名不同程序
bash
# pidof 匹配的是进程映像名(comm),不是命令行参数
# 两个同名二进制在不同路径运行时,pidof 无法区分,会一起返回pidof 只看进程的可执行名(通常是
argv[0]的基名或 comm),不区分路径、不解析命令行参数。如果你同时跑了两个不同路径但同名的程序,pidof 会把它们都算进来,发信号时要小心误伤。
五、实战:脚本里重载服务
bash
#!/bin/bash
pids=$(pidof myservice) || { echo "未运行"; exit 1; }
kill -USR1 $pids一句话总结
pidof = 按可执行名查 PID:输出该名字下所有进程 PID,-s 只取一个;常配合 kill 发信号。它不能按用户/正则筛选——那要用 pgrep,想直接按名杀用 pkill。