优先用pidof查进程名(如pidof nginx返回所有PID,pidof -s nginx返回单个主进程PID),需匹配命令行或用户时用pgrep(如pgrep -f "java.*app.jar"或pgrep -u root sshd),避免ps | grep因grep自身进程、字段偏移和截断导致的误匹配与漏检。

直接用 pidof 或 pgrep,别用 ps | grep 套路——后者容易漏 PID、多出 grep 自身进程、还依赖 awk 提取字段,纯属绕远。
查单个进程名,优先用 pidof
pidof 是专为这事写的,不带多余输出,输入即得 PID 列表:
- 查 nginx 主进程:
pidof nginx,返回类似1234 5678 9012(多个 worker 进程) - 只要一个 PID(比如 kill 主进程):
pidof -s nginx,只返回最老的那个(通常是主进程) - 注意:如果只输进程名(如
pidof java),可能匹配到所有含 “java” 字符串的进程;用完整路径更准:pidof /usr/bin/java
要按命令行内容或用户过滤,用 pgrep
pgrep 比 pidof 更灵活,尤其适合匹配启动参数或区分同名进程:
- 查带
-jar app.jar的 Java 进程:pgrep -f "java.*app.jar" - 只查 root 用户的 sshd:
pgrep -u root sshd - 只取最新启动的那个:
pgrep -n python3(适合重启后找新 PID) - 想确认是否真在运行,加
-c统计数量:pgrep -c nginx返回0就说明没起来
别踩 ps | grep 的坑
这写法看似通用,实则三处易错:
- grep 自身会出现在结果里,必须加
grep -v grep或用awk '/[p]attern/'技巧绕过 - 字段位置不固定:
ps aux和ps -ef的 PID 列号不同,awk '{print $2}'在一种下有效,换种就错 - 进程名被截断时匹配失败:比如
ps aux中长命令行会被省略,grep找不到完整关键词
真正需要手动解析时(比如写脚本且环境不保证有 pgrep),优先用 ps -o pid= -C name ——它靠内核识别进程名,不依赖字符串匹配,也避开了 grep 干扰。


















