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 #
pkill
和killall
都可以按名称终止进程pkill
支持更复杂的模式匹配和过滤条件pkill
可以匹配完整的命令行(使用-f
选项)killall
在某些系统上可能更可靠地匹配完整的进程名
注意事项 #
-
使用
pkill
时要小心,特别是在系统进程上:- 终止关键系统进程可能导致系统不稳定或崩溃
- 使用
-v
(反向匹配)选项尤其危险
-
进程名匹配:
- 默认情况下,
pkill
匹配包含指定模式的进程名 - 使用
-x
选项可以要求精确匹配 - 使用
-f
选项可以匹配完整的命令行
- 默认情况下,
-
权限限制:
- 普通用户只能向自己的进程发送信号
- 超级用户(root)可以向任何进程发送信号
提示 #
- 在使用
pkill
之前,可以先使用pgrep -l
或pgrep -a
查看哪些进程会被匹配 - 使用
-x
选项可以进行精确匹配,避免终止不需要的进程 - 使用
-f
选项可以匹配完整的命令行,这在区分同名但参数不同的进程时很有用 - 使用
-n
和-o
选项可以分别只终止最新和最老的进程 - 在多用户系统上,使用
-u
选项可以只终止特定用户的进程 - 使用
-P
选项可以终止特定父进程的所有子进程 - 使用
-c
选项可以计算匹配的进程数量,而不实际发送信号 - 在脚本中,通常先使用
pgrep
检查进程是否存在,然后再使用pkill
终止进程