pidof 是 Linux 中根据进程名查询 PID 的轻量工具,支持精准匹配、脚本识别及与 kill/systemctl 配合使用,但受限于进程名真实性、权限和系统环境。

pidof 命令是 Linux 中一个轻量、高效的工具,专用于根据进程名反查其 PID(进程标识号),无需依赖 ps + grep 组合,避免了误匹配和多余输出。
基础用法:直接查服务主进程 PID
多数守护进程(如 nginx、sshd、redis-server)启动后会以可执行文件名为名运行,pidof 可直接识别:
- pidof nginx —— 返回所有 nginx 工作进程的 PID,空格分隔
- pidof sshd —— 获取 ssh 服务主进程及子进程 PID
- pidof redis-server —— 注意需用实际启动的二进制名,不是 service 名
精准匹配:排除干扰进程
当多个同名程序运行时(例如同时开了两个 python 脚本),pidof 默认返回全部。可通过 -x 选项支持脚本名,或配合其他命令过滤:
- pidof -x backup.sh —— 查找以 backup.sh 启动的 shell 进程(需启用 -x)
- pidof java | xargs -n1 ps -o pid,cmd -p | grep 'tomcat' —— 先取所有 java PID,再筛选含 tomcat 的行
实用场景:配合 kill 或 systemctl 使用
pidof 常作为管道前置命令,快速完成进程管理操作:
- kill $(pidof nginx) —— 优雅终止所有 nginx 进程
- kill -9 $(pidof -o %PPID myapp) —— 排除父 shell 的 PID 后强制结束 myapp(-o %PPID 表示忽略调用它的那个 shell 进程)
- systemctl restart $(basename $(pidof -x /usr/local/bin/mydaemon)) —— 结合 basename 提取服务名用于 systemctl(需确保服务单元名与二进制名一致)
注意点:常见不生效原因
pidof 查不到进程,通常不是命令问题,而是以下情况:
- 进程实际运行的二进制名与预期不同(如用 python3 app.py 启动,进程名为 python3,不是 app.py)
- 程序以 daemon 方式运行但重命名了进程名(如通过 prctl 修改 comm 字段),pidof 无法识别
- 非 root 用户执行时,对部分系统进程(如 systemd、kthreadd)无权限读取,pidof 默认不显示它们
- 某些容器环境或精简系统未预装 sysvinit 工具集,pidof 可能不可用(可用 pgrep 替代)










