pgrep命令

pgrep 命令 #

pgrep命令用于根据名称和其他属性查找进程,并显示匹配进程的进程 ID(PID)。它是一个方便的工具,可以快速找到特定进程的 PID,而不需要使用ps命令和grep的组合。

语法 #

pgrep [选项] 模式

常用选项 #

选项 描述
-c, --count 只显示匹配的进程数量
-d, --delimiter 分隔符 指定输出分隔符(默认为换行符)
-f, --full 匹配完整的命令行,而不仅仅是进程名
-g, --pgroup 进程组ID列表 只匹配列出的进程组中的进程
-G, --group 组列表 只匹配列出的实际组 ID 中的进程
-i, --ignore-case 忽略大小写
-l, --list-name 列出进程名和进程 ID
-a, --list-full 列出完整的命令行和进程 ID
-n, --newest 只选择最新的进程
-o, --oldest 只选择最老的进程
-P, --parent 父进程ID列表 只匹配列出的父进程的子进程
-s, --session 会话ID列表 只匹配列出的会话中的进程
-t, --terminal 终端列表 只匹配列出的终端上运行的进程
-u, --euid 用户列表 只匹配列出的有效用户 ID 的进程
-U, --uid 用户列表 只匹配列出的实际用户 ID 的进程
-v, --inverse 反向匹配,选择不匹配的进程
-w, --lightweight 列出所有 TID(线程 ID)
-x, --exact 只匹配与模式完全匹配的进程名
-F, --pidfile 文件 从文件中读取 PID
-L, --logpidfile 如果 PID 文件未锁定,则失败
-r, --runstates 状态 匹配指定运行状态的进程
--ns PID 匹配与 PID 相同命名空间的进程
--nslist 命名空间列表 列出要匹配的命名空间
-h, --help 显示帮助信息
-V, --version 显示版本信息

常见用法 #

1. 查找进程 ID #

pgrep firefox

这会显示所有名为"firefox"的进程的 PID。

2. 计算匹配的进程数量 #

pgrep -c firefox

3. 显示进程名和进程 ID #

pgrep -l firefox

输出示例:

1234 firefox
5678 firefox-bin

4. 显示完整的命令行和进程 ID #

pgrep -a firefox

输出示例:

1234 /usr/lib/firefox/firefox
5678 /usr/lib/firefox/firefox-bin

5. 匹配完整的命令行 #

pgrep -f "python script.py"

这会匹配命令行中包含"python script.py"的进程。

6. 忽略大小写 #

pgrep -i firefox

这会匹配"firefox"、“Firefox”、“FIREFOX"等。

7. 只显示最新的进程 #

pgrep -n firefox

8. 只显示最老的进程 #

pgrep -o firefox

9. 查找特定用户的进程 #

pgrep -u username firefox

10. 查找特定终端上的进程 #

pgrep -t pts/0

11. 反向匹配 #

pgrep -v firefox

这会显示所有名称不是"firefox"的进程的 PID。

12. 精确匹配 #

pgrep -x firefox

这只会匹配名称恰好是"firefox"的进程,而不是包含"firefox"的进程。

13. 使用自定义分隔符 #

pgrep -d, firefox

输出示例:

1234,5678

14. 查找特定父进程的子进程 #

pgrep -P 1234

这会显示父进程 ID 为 1234 的所有子进程的 PID。

与其他命令结合使用 #

1. 终止所有匹配的进程 #

pgrep firefox | xargs kill

2. 查看所有匹配进程的详细信息 #

pgrep firefox | xargs ps -f

3. 监控特定进程的资源使用情况 #

pgrep -f "python script.py" | xargs watch -n 1 ps -o pid,ppid,cmd,%cpu,%mem -p

4. 查找并重新启动进程 #

if ! pgrep -x "service_name" > /dev/null; then
    service service_name start
fi

5. 查找并限制进程的 CPU 使用率 #

pgrep -f "process_name" | xargs -I{} renice +10 {}

6. 查找并移动进程到特定 CPU 核心 #

pgrep -f "process_name" | xargs -I{} taskset -pc 0-1 {}

实用示例 #

1. 检查服务是否运行 #

if pgrep -x "nginx" > /dev/null; then
    echo "Nginx is running"
else
    echo "Nginx is not running"
fi

2. 查找占用内存最多的 Java 进程 #

pgrep java | xargs ps -o pid,cmd,%mem --sort=-%mem | head -n 2

3. 查找特定用户的所有 Python 进程 #

pgrep -u username -a python

4. 查找运行时间最长的进程 #

pgrep -o -a bash

5. 查找最近启动的进程 #

pgrep -n -a bash

6. 查找特定进程组的所有进程 #

pgrep -g 1234

7. 查找所有 Web 服务器进程 #

pgrep -f "apache|nginx|httpd"

8. 查找所有数据库进程 #

pgrep -f "mysql|postgres|oracle|mongodb"

与 pkill 的关系 #

pgreppkill是一对相关命令:

  • pgrep查找进程并显示其 PID
  • pkill查找进程并向其发送信号(默认为 SIGTERM)

它们接受相同的选项和参数,但执行不同的操作。

提示 #

  • 使用-f选项可以匹配完整的命令行,这在区分同名但参数不同的进程时很有用
  • 使用-x选项可以进行精确匹配,避免匹配到不需要的进程
  • 使用-l-a选项可以显示更多信息,而不仅仅是 PID
  • 在脚本中,通常使用pgrep -x "process_name" > /dev/null来检查进程是否运行
  • 使用-n-o选项可以分别找到最新和最老的进程
  • 使用-c选项可以计算匹配的进程数量
  • 在多用户系统上,使用-u选项可以只查找特定用户的进程
  • 使用-P选项可以查找特定父进程的所有子进程
  • 在处理多个匹配项时,可以使用-d选项指定自定义分隔符