使用 'ps' 和 'kill' 掌握 Linux 进程管理指南

通过学习使用 `ps` 和 `kill` 管理运行中的应用程序,掌握必备的 Linux 系统管理技能。本指南详细介绍了如何使用 `ps` 来检查进程 ID (PID)、资源使用情况和状态,以及如何利用 `kill` 发送特定信号——从优雅终止 (SIGTERM) 到强制中断 (SIGKILL)——从而确保系统稳定且可控地运行。

40 浏览量

使用 'ps' 和 'kill' 理解 Linux 进程管理的指南

进程管理是有效 Linux 系统管理的基础。当应用程序无响应、消耗过多资源或需要正常重启时,了解如何识别和与之交互至关重要。本指南将全面介绍 Linux 中进程管理的核心:用于查看进程状态的 ps 命令和用于发送信号管理其生命周期的 kill 命令。

理解 Linux 如何处理运行中的程序(每个程序都有一个唯一的进程 ID (PID))可以帮助管理员维护系统稳定性、排查性能瓶颈并确保服务按预期运行。我们将探讨使这些命令成为任何系统管理员工具箱中不可或缺的工具的基本语法和常用选项。

Linux 进程模型:PID 和状态

在 Linux 中,每个运行的程序、服务或任务都被视为一个进程。每个进程都由一个进程 ID (PID) 唯一标识,这是一个内核在创建时分配的非负整数。PID 是系统工具引用和操作特定进程的主要方式。

进程会经历各种状态(例如,运行、睡眠、停止、僵尸)。了解进程状态可以立即指导排查步骤。

使用 ps 命令查看进程

ps (process status) 命令用于显示当前运行进程的信息。由于输出信息可能非常庞杂,可以使用不同的选项来选择要显示的进程以及要包含的信息列。

核心 ps 语法和选项

ps 命令的选项有两种主要风格:Unix 风格(以 - 开头)和 BSD 风格(无前缀)。现代实践通常倾向于组合使用 Unix 风格的选项以获得更全面的视图。

1. 查看所有进程(BSD 风格)

用于系统概览的最常用命令是 ps aux

  • a: 显示所有用户的进程。
  • u: 以面向用户的格式显示进程(显示用户、CPU 使用率、内存使用率等)。
  • x: 包括没有控制终端的进程(如后台守护进程)。
ps aux

2. 以标准格式查看进程(UNIX 风格)

ps -ef 命令提供了一个旧的、但仍广泛使用的完整列表格式。

  • -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 Web 服务器 (httpd) 的所有运行实例:

ps aux | grep httpd

提示: 当使用 ps | grep 时,您通常会在输出中看到 grep 命令本身。要过滤掉它,请在搜索模式中使用方括号表示法:
bash ps aux | grep '[h]ttpd'

使用 kill 命令管理进程

kill 命令不仅仅是停止进程;它向进程发送信号。默认行为是请求正常终止,但其他信号可以指示进程重新读取配置文件、暂时停止执行或强制立即退出。

理解信号

信号是标准化的数字或助记符代码。您可以使用 kill -l 列出可用信号。

信号名称 信号编号 描述
SIGTERM 15 默认的终止信号。要求进程正常关闭。
SIGKILL 9 立即强制终止信号。进程无法忽略此信号。
SIGHUP 1 挂断信号,通常用于守护进程重新读取配置文件。
SIGSTOP 19 停止(暂停)进程而不终止它。
SIGCONT 18 恢复已停止的进程。

使用 kill 发送信号

kill 命令的基本语法是:

kill -SIGNAL PID

1. 正常终止(最佳实践)

始终首先尝试使用 SIGTERM(信号 15)正常终止进程。这会给应用程序保存数据和关闭连接的时间。

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(僵尸),则父进程已失效,如果无法杀死父进程,可能需要重新启动。
  3. 尝试正常停止: 发送 SIGTERM(默认的 kill PID)。等待几秒钟。
  4. 验证停止: 再次运行 ps
  5. 强制停止(如果需要): 如果进程仍然存在,发送 SIGKILLkill -9 PID)。

掌握 pskill 对于维护一个健康、响应迅速的 Linux 环境至关重要。通过理解 PID 和可用的各种信号,管理员可以精确地控制系统执行。