pgrep 比 ps aux | grep 更可靠,因其直接读取 procfs、不产生干扰进程、默认输出纯净 PID、支持 -f 匹配完整命令行、精确匹配(-x)、多条件组合(-u/-c/-o/-d)及权限与空格处理。
直接用 pgrep 就能干净拿到 PID,不用再写 ps aux | grep 加过滤,也避开了 grep 自身进程混入结果的坑。
pgrep nginx 比 ps aux | grep nginx 更可靠后者会把 grep nginx 这行也当匹配项输出,得额外加 grep -v grep 才能剔除;pgrep 从 procfs 直接读取进程信息,不启动新进程,天然无干扰。
kill、ps 等命令ps aux 显示不全,但 pgrep 的 -f 选项能绕过这个限制bash,pgrep bash 不会匹配到 bashful 或 rbash(除非加 -i 或正则)pgrep -f 匹配完整命令行才是日常刚需很多服务启动时进程名还是 python 或 java,真正区分靠参数。这时只查进程名根本找不到目标。
pgrep -f "python manage.py runserver" → 找到 Django 开发服务器pgrep -f "java.*-jar.*app.jar" → 匹配带 jar 参数的 Java 进程pgrep -f "nginx: worker process" → 区分 master 和 worker(注意空格和冒号要写全)-f 时,pgrep python 可能返回几十个无关的 Python 进程实际运维中高频组合就那么几个,记住场景比死背选项更有效:
pgrep -u www-data nginx
pgrep -c nginx 返回 1 才安心pgrep -o nginx | xargs kill
pgrep -x sshd 不会匹配到 sshd_config 或 ssh-agent
pgrep -f "redis|mysql"(注意 shell 会解释管道符,得加引号)pgrep 输出默认是换行分隔,但脚本里拼接命令时可能需要逗号或空格——这时候 -d 就不能省:
pgrep -d, -f "node server.js" → 输出 1234,5678,方便塞进 kill 命令./my script.sh),必须用双引号包裹整个模式,单引号不行(shell 不展开变量)pgrep -u root 必须用 root 权限执行,否则静默返回空pgrep -P $PID 查子进程时,父进程若已退出,结果为空——不是命令错,是进程树已变