使用 '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

按名称管理进程:pkillkillall

虽然 pskill 依赖于 PID,但有时按名称定位进程更快。请极其谨慎地使用这些命令,因为它们可能同时影响多个进程。

killall

终止所有与提供的进程名称完全匹配的进程。

killall httpd  # 向所有名为 'httpd' 的进程发送 SIGTERM
killall -9 cron  # 强制杀死所有 'cron' 进程

pkill

允许在选择要发送信号的进程时进行模式匹配(正则表达式),比 killall 更灵活。

# 杀死任何完整命令行包含 'firefox' 的进程
pkill -f firefox

关于 killallpkill 的警告: 如果你不小心定位到关键系统进程(如 initsystemd),可能会导致整个操作系统不稳定或崩溃。在使用 killallpkill 使用宽泛模式之前,始终使用 ps 验证目标 PID。

安全的进程管理工作流程

在排查失控的应用程序时,请遵循以下系统化方法:

  1. 识别: 使用 ps aux | grep <process_name> 查找进程 PID 并验证其状态。
  2. 检查状态: 检查 STAT 列。如果它是 Z,则进程已经死亡;你需要父进程来回收它。在杀死任何东西之前检查 PPID
  3. 尝试优雅停止: 发送 SIGTERM(默认的 kill PID)。等待几秒钟。
  4. 验证停止: 再次运行 ps
  5. 如果需要则强制停止: 如果进程仍然存在并且你了解风险,则使用 kill -9 PID 发送 SIGKILL

实用的习惯很简单:识别 PID,检查所有者和状态,发送最温和的有效信号,然后验证结果。这使进程清理变得可预测,并减少了停止错误工作负载的机会。