使用 'ps' 和 'kill' 掌握 Linux 进程管理指南
学习如何使用 `ps` 检查 Linux 进程、解读关键列,并通过 `kill`、`pkill` 和 `killall` 安全地停止进程。
使用 'ps' 和 'kill' 理解 Linux 进程管理指南
管理 Linux 进程是一项日常故障排除技能。当应用程序挂起、备份任务占用 CPU 或守护进程需要干净重启时,ps 可以帮助你找到进程,而 kill 则允许你向其发送正确的信号。
每个运行的程序都有一个进程 ID,即 PID。一旦你知道该 PID,就可以检查所有权、父进程、CPU 和内存使用情况,并决定是请求进程干净地停止,还是作为最后手段强制终止它。
Linux 进程模型:PID 和状态
在 Linux 中,每个运行的程序、服务或任务都被视为一个进程。每个进程由一个进程 ID (PID) 唯一标识,这是一个由内核在创建时分配的正整数。PID 是系统工具引用和操作特定进程的主要方式。
进程会在运行、睡眠、停止和僵尸等状态之间转换。睡眠进程通常正在等待 I/O 或其他事件。僵尸进程已经退出,但其父进程尚未收集其退出状态。
使用 ps 命令查看进程
ps(进程状态)命令用于显示当前正在运行的进程的信息。由于输出可能非常庞大,因此使用不同的选项来选择要显示的进程以及要包含的信息列。
基本的 ps 语法和标志
ps 标志主要有两种风格:Unix 风格(以 - 为前缀)和 BSD 风格(无前缀)。现代实践通常倾向于组合使用 Unix 风格标志以获得全面的视图。
1. 查看所有进程(BSD 风格)
用于系统概览的最常见命令是 ps aux。
a:显示所有用户的进程。u:以面向用户的格式显示进程(显示用户、CPU 使用率、内存使用率等)。x:包括没有控制终端的进程(如后台守护进程)。
ps aux
2. 以标准格式查看进程(UNIX 风格)
ps -ef 命令以 POSIX 风格格式提供完整的列表。
-e:选择所有进程。-f:显示完整格式列表,包括 PPID 和命令参数。
ps -ef
解读关键输出列
无论使用何种标志,某些列对于进程管理至关重要:
| 列名 | 描述 |
|---|---|
| PID | 进程 ID(唯一标识符) |
| PPID | 父进程 ID(启动此进程的进程的 PID) |
| USER | 拥有该进程的用户 |
| %CPU | 使用的 CPU 时间百分比 |
| %MEM | 使用的物理内存百分比 |
| VSZ | 虚拟内存大小(以 KiB 为单位) |
| RSS | 常驻集大小(使用的物理内存,以 KiB 为单位) |
| STAT | 进程的当前状态(例如,R=运行,S=睡眠,Z=僵尸) |
| COMMAND | 启动该进程的命令 |
使用 grep 过滤进程
要查找特定进程,可以将 ps 的输出通过管道传递给 grep。
例如,查找 Apache httpd 进程:
ps aux | grep httpd
提示:
ps | grep通常会显示grep进程本身。使用括号表示法可以避免这个额外的匹配:ps aux | grep '[h]ttpd'
使用 kill 命令管理进程
kill 命令不仅仅是停止进程;它向进程发送信号。默认行为是请求优雅终止,但其他信号可以指示进程重新读取配置文件、暂时停止执行或强制立即退出。
理解信号
信号是标准化的数字或助记符代码。你可以使用 kill -l 列出可用的信号。
| 信号名称 | 信号编号 | 描述 |
|---|---|---|
| SIGTERM | 15 | 默认的终止信号。请求进程优雅地关闭。 |
| SIGKILL | 9 | 立即的、强制性的终止信号。进程无法忽略此信号。 |
| SIGHUP | 1 | 挂起信号,通常用于让守护进程重新读取配置文件。 |
| SIGSTOP | 在 x86 Linux 上通常为 19 | 停止(暂停)进程而不终止它。 |
| SIGCONT | 在 x86 Linux 上通常为 18 | 恢复一个已停止的进程。 |
使用 kill 发送信号
kill 命令的基本语法是:
kill -SIGNAL PID
1. 优雅终止(最佳实践)
首先尝试 SIGTERM。它给应用程序一个保存状态、关闭文件、完成请求和释放锁的机会。
kill 12345 # 默认为 SIGTERM (15)
# 或者
kill -15 12345
2. 强制终止(最后手段)
如果进程无响应并忽略 SIGTERM,则使用 SIGKILL(信号 9)。这会在没有应用程序级清理的情况下停止进程。根据进程正在执行的操作,这可能会导致部分写入、遗留的锁文件或中断的事务。
kill -9 12345
按名称管理进程:pkill 和 killall
虽然 ps 和 kill 依赖于 PID,但有时按名称定位进程更快。请极其谨慎地使用这些命令,因为它们可能同时影响多个进程。
killall
终止所有与提供的进程名称完全匹配的进程。
killall httpd # 向所有名为 'httpd' 的进程发送 SIGTERM
killall -9 cron # 强制杀死所有 'cron' 进程
pkill
允许在选择要发送信号的进程时进行模式匹配(正则表达式),比 killall 更灵活。
# 杀死任何完整命令行包含 'firefox' 的进程
pkill -f firefox
关于
killall和pkill的警告: 如果你不小心定位到关键系统进程(如init或systemd),可能会导致整个操作系统不稳定或崩溃。在使用killall或pkill使用宽泛模式之前,始终使用ps验证目标 PID。
安全的进程管理工作流程
在排查失控的应用程序时,请遵循以下系统化方法:
- 识别: 使用
ps aux | grep <process_name>查找进程 PID 并验证其状态。 - 检查状态: 检查
STAT列。如果它是Z,则进程已经死亡;你需要父进程来回收它。在杀死任何东西之前检查PPID。 - 尝试优雅停止: 发送
SIGTERM(默认的kill PID)。等待几秒钟。 - 验证停止: 再次运行
ps。 - 如果需要则强制停止: 如果进程仍然存在并且你了解风险,则使用
kill -9 PID发送SIGKILL。
实用的习惯很简单:识别 PID,检查所有者和状态,发送最温和的有效信号,然后验证结果。这使进程清理变得可预测,并减少了停止错误工作负载的机会。