pkill命令

pkill 命令 #

pkill命令用于根据名称和其他属性查找进程,并向匹配的进程发送信号。它结合了pgrep的查找功能和kill的信号发送功能,是一个方便的进程管理工具。

语法 #

pkill [选项] 模式

常用选项 #

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

常用信号 #

信号编号 信号名称 描述
1 SIGHUP 挂起信号,通常用于重新加载配置
2 SIGINT 中断信号,通常由 Ctrl+C 触发
3 SIGQUIT 退出信号,通常由 Ctrl+\触发
9 SIGKILL 强制终止信号,无法被捕获或忽略
15 SIGTERM 终止信号(默认)
18 SIGCONT 继续执行已停止的进程
19 SIGSTOP 停止进程执行,无法被捕获或忽略
20 SIGTSTP 停止进程执行,通常由 Ctrl+Z 触发

常见用法 #

1. 终止进程(使用默认信号 SIGTERM) #

pkill firefox

这会向所有名为"firefox"的进程发送 SIGTERM 信号。

2. 使用特定信号终止进程 #

pkill -9 firefox

pkill -KILL firefox

这会向所有名为"firefox"的进程发送 SIGKILL 信号。

3. 匹配完整的命令行 #

pkill -f "python script.py"

这会向命令行中包含"python script.py"的进程发送信号。

4. 忽略大小写 #

pkill -i firefox

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

5. 只终止最新的进程 #

pkill -n firefox

6. 只终止最老的进程 #

pkill -o firefox

7. 终止特定用户的进程 #

pkill -u username firefox

8. 终止特定终端上的进程 #

pkill -t pts/0

9. 反向匹配 #

pkill -v firefox

这会向所有名称不是"firefox"的进程发送信号(危险操作,不推荐)。

10. 精确匹配 #

pkill -x firefox

这只会向名称恰好是"firefox"的进程发送信号,而不是包含"firefox"的进程。

11. 重新加载配置(使用 SIGHUP 信号) #

pkill -HUP nginx

12. 终止特定父进程的所有子进程 #

pkill -P 1234

这会向父进程 ID 为 1234 的所有子进程发送信号。

13. 计算匹配的进程数量,但不发送信号 #

pkill -c firefox

实用示例 #

1. 重启所有 Web 服务器进程 #

pkill -HUP apache2

2. 终止所有 Java 进程 #

pkill java

3. 终止特定用户的所有进程 #

pkill -u username

4. 终止特定应用的所有实例 #

pkill -9 -f "chrome"

5. 终止特定脚本的所有实例 #

pkill -f "python backup.py"

6. 终止所有 SSH 会话 #

pkill -f sshd:

7. 暂停所有视频处理进程 #

pkill -STOP -f "ffmpeg"

8. 恢复所有暂停的视频处理进程 #

pkill -CONT -f "ffmpeg"

9. 重新加载所有配置文件 #

pkill -HUP -f "config_watcher"

10. 终止所有僵尸进程的父进程 #

pkill -f "defunct"

与其他命令的区别 #

pkill vs. kill #

  • kill需要进程 ID,而pkill使用进程名或其他属性
  • pkill可以同时终止多个匹配的进程
  • pkill提供了更多的过滤选项,如用户、终端等

pkill vs. killall #

  • pkillkillall都可以按名称终止进程
  • pkill支持更复杂的模式匹配和过滤条件
  • pkill可以匹配完整的命令行(使用-f选项)
  • killall在某些系统上可能更可靠地匹配完整的进程名

注意事项 #

  1. 使用pkill时要小心,特别是在系统进程上:

    • 终止关键系统进程可能导致系统不稳定或崩溃
    • 使用-v(反向匹配)选项尤其危险
  2. 进程名匹配:

    • 默认情况下,pkill匹配包含指定模式的进程名
    • 使用-x选项可以要求精确匹配
    • 使用-f选项可以匹配完整的命令行
  3. 权限限制:

    • 普通用户只能向自己的进程发送信号
    • 超级用户(root)可以向任何进程发送信号

提示 #

  • 在使用pkill之前,可以先使用pgrep -lpgrep -a查看哪些进程会被匹配
  • 使用-x选项可以进行精确匹配,避免终止不需要的进程
  • 使用-f选项可以匹配完整的命令行,这在区分同名但参数不同的进程时很有用
  • 使用-n-o选项可以分别只终止最新和最老的进程
  • 在多用户系统上,使用-u选项可以只终止特定用户的进程
  • 使用-P选项可以终止特定父进程的所有子进程
  • 使用-c选项可以计算匹配的进程数量,而不实际发送信号
  • 在脚本中,通常先使用pgrep检查进程是否存在,然后再使用pkill终止进程