在 Red Hat Enterprise Linux 中监控进程

Red Hat Enterprise LinuxBeginner
立即练习

介绍

在本实验中,你将获得监控和管理 Linux 进程的实践经验,这是任何系统管理员或开发人员都必须掌握的基本技能。你将学习使用 pstop 命令来理解进程状态和生命周期,控制后台和前台作业,并使用 killkillallpkill 命令有效地终止进程。此外,你将学习如何使用 uptimelscpu 命令监控系统负载和 CPU 使用率,并使用 top 命令详细分析进程活动。本实验将为你提供必要的工具和知识,以有效地管理进程并维护 RHEL 系统的健康状态。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 93%。获得了学习者 100% 的好评率。

使用 ps 和 top 命令理解进程状态和生命周期

在本步骤中,你将学习 Linux 进程的状态及其生命周期。理解进程状态对于有效地监控和管理系统资源至关重要。你将使用 pstop 命令来观察进程及其状态。

Linux 中每个进程都有一个状态,描述其当前活动。这些状态由内核定义,指示进程是否正在运行、休眠、停止或处于其他状态。

让我们首先使用 ps 命令检查进程状态。ps 命令报告当前进程的快照。

首先,打开你的终端。你可以在桌面上点击终端图标,或者按下 Ctrl+Alt+T。你的默认工作目录是 ~/project

要查看系统上所有正在运行的进程,包括那些没有控制终端的进程,请使用 ps aux 命令。aux 选项显示所有用户(a)拥有的进程、没有控制终端的进程(x),并以用户友好的格式显示(u)。

ps aux

你将看到一个长列表的进程。请注意 STAT 列,它显示每个进程的状态。你可能观察到的常见状态包括:

  • R: 运行或可运行(在 CPU 上或等待运行)
  • S: 可中断休眠(等待事件完成)
  • D: 不可中断休眠(等待 I/O,无法中断)
  • T: 停止(由信号暂停)
  • Z: 僵尸进程(进程已终止,但父进程尚未收集其退出状态)
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 171820 16140 ?        Ss   HH:MM   0:01 /usr/lib/systemd/systemd ...
root           2  0.0  0.0      0     0 ?        S    HH:MM   0:00 [kthreadd]
labex       3448  0.0  0.2 266904  3836 pts/0    R+   HH:MM   0:00 ps aux
...output omitted...

接下来,让我们使用 ps -ef 命令。此命令提供所有进程(e)的完整列表(f),显示更多详细信息,例如父进程 ID(PPID)、CPU 使用率(C)、启动时间(STIME)和命令(CMD)。

ps -ef

此输出通常用于查看进程之间的父子关系,尽管它没有明确显示树状结构。

UID        PID  PPID  C STIME TTY          TIME CMD
root           1       0  0 HH:MM ?        00:00:01 /usr/lib/systemd/systemd ...
root           2       0  0 HH:MM ?        00:00:00 [kthreadd]
root           3       2  0 HH:MM ?        00:00:00 [rcu_gp]
...output omitted...

为了可视化进程层次结构,你可以使用 ps --forest 选项。这将以树状格式显示进程,更容易理解哪些进程启动了其他进程。

ps --forest

此命令对于调试和理解系统上不同服务和应用程序的结构特别有用。

  PID TTY          TIME CMD
 2768 pts/0    00:00:00 bash
 5947 pts/0    00:00:00  \_ sleep 10000
 6377 pts/0    00:00:00  \_ ps --forest
...output omitted...

现在,让我们探索 top 命令,它提供正在运行的系统的动态实时视图。它显示系统信息的摘要以及 Linux 内核当前正在管理的进程或线程的列表。

运行 top 命令:

top

你将看到一个交互式显示。顶部部分提供系统摘要信息,包括运行时间、平均负载、任务摘要、CPU 统计信息和内存使用情况。底部部分列出各个进程,默认按 CPU 使用率排序。

top 输出中,观察 S 列的进程状态,类似于 ps。你还可以看到每个进程的 %CPU(CPU 使用率百分比)和 %MEM(内存使用率百分比)。

top - HH:MM:SS up DD min,  X users,  load average: X.XX, X.XX, X.XX
Tasks: XXX total,   X running, XXX sleeping,   X stopped,   X zombie
%Cpu(s):  X.X us,  X.X sy,  X.X ni, XX.X id,  X.X wa,  X.X hi,  X.X si,  X.X st
MiB Mem :   XXXX.X total,   XXXX.X free,    XXX.X used,    XXX.X buff/cache
MiB Swap:   XXXX.X total,   XXXX.X free,      X.X used.   XXXX.X avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
XXXX labex     20   0  XXXXXX   XXXX   XXXX R   X.X   X.X   0:00.0X top
...output omitted...

在运行 top 时,按 q 键退出并返回终端提示符。

理解这些命令以及它们提供的信息对于监控和排除 Linux 系统上的进程故障至关重要。

控制后台和前台作业

在本步骤中,你将学习如何在你的 shell 会话中管理后台和前台作业。这是高效使用命令行的基本技能,允许你运行长时间运行的任务,而不会占用你的终端。

在 shell 的上下文中,“作业”指的是 shell 正在管理的命令或命令管道。你可以将作业运行在后台、将其调到前台或暂停它们。

让我们从在后台运行一个简单的命令开始。我们将使用 sleep 命令,它只是等待指定的时间。

要在后台运行 sleep 10000(等待 10000 秒)命令,请在命令后添加一个&符号(&):

sleep 10000 &

按下 Enter 后,shell 将立即返回提示符,sleep 命令将在后台运行。你将看到类似于此的输出,指示作业号及其进程 ID (PID):

[1] 5947

[1] 表示这是你当前 shell 会话中的第 1 个作业,5947sleep 进程的 PID。

要查看 shell 当前管理的所有作业列表,请使用 jobs 命令:

jobs

你应该看到 sleep 命令列为正在运行的后台作业:

[1]+ Running    sleep 10000 &

+ 符号位于 [1] 旁边,表示这是当前作业(如果没有指定作业号,则默认会对其进行操作)。

现在,让我们将这个后台作业调到前台。这意味着该作业将再次控制你的终端。使用 fg 命令后跟作业号(以 % 为前缀):

fg %1

sleep 10000 命令现在位于前台。你的终端将被此命令占用,直到它完成或被暂停,你才能再次获得提示符。

sleep 10000

当命令在前景运行时,你可以通过按下 Ctrl+Z 将其发送到后台并暂停它。这会向该进程发送 SIGTSTP 信号。

现在按下 Ctrl+Z

^Z

你将看到指示该作业已停止并移至后台的输出:

[1]+  Stopped                 sleep 10000

现在,如果你再次运行 jobs,你将看到 sleep 命令处于 Stopped 状态:

jobs
[1]+ Stopped                 sleep 10000

要恢复已停止的后台作业,可以使用 bg 命令后跟作业号。这将重新启动后台作业。

bg %1

该作业现在将再次在后台运行:

[1]+ sleep 10000 &

最后,让我们清理后台作业。你可以使用 kill 命令及其 PID 来终止后台作业,或者将其调到前台然后终止它(例如,使用 Ctrl+C)。现在,让我们将其调到前台并终止它。

fg %1

现在 sleep 10000 位于前台,按下 Ctrl+C 来终止它。这会向该进程发送 SIGINT 信号。

^C

你将看到一条消息,指示该作业已终止:

[1]+  Terminated              sleep 10000

如果你再次运行 jobs,你应该看到没有更多作业列出:

jobs
(no output)

这演示了在后台和前台管理作业的基本工作流程,这对于终端中的多任务处理至关重要。

使用 kill, killall 和 pkill 终止进程

在本步骤中,你将学习如何使用 killkillallpkill 命令终止进程。这些命令对于管理系统资源和停止不当行为的应用程序至关重要。

Linux 中的进程会响应信号。信号是一种发送给进程的软件中断。不同的信号具有不同的含义,例如终止进程、暂停进程或使其重新加载其配置。

首先,让我们了解一些基本的进程管理信号:

  • SIGTERM (15): kill 命令默认发送的信号。这是一个“礼貌”的终止请求。进程可以捕获此信号,清理自身,然后退出。
  • SIGKILL (9): 一种“不可阻止”的信号,强制立即终止。进程无法忽略或处理此信号。仅在必要时使用。
  • SIGHUP (1): 通常用于指示进程重新加载其配置文件,而无需重新启动。
  • SIGINT (2): 通过按下 Ctrl+C 发送,通常用于中断前台进程。
  • SIGSTOP (19): 暂停进程。它无法被阻止或处理。
  • SIGCONT (18): 恢复已暂停的进程。

你可以使用 kill -l 列出所有可用信号及其编号:

kill -l

你将看到类似这样的信号列表:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
...output omitted...

使用 kill

kill 命令将指定信号发送到由其进程 ID (PID) 标识的进程。

让我们创建一些后台进程来练习终止它们。我们将再次使用 sleep 命令。

sleep 300 &
sleep 301 &
sleep 302 &

现在,使用 jobs 查看它们的作业号和 PID:

jobs
[1] 1234
[2] 1235
[3] 1236

(注意:你的 PID 会有所不同。)

让我们找到第一个 sleep 进程的 PID。你可以使用 ps aux | grep sleep 并查找与 sleep 300 相关的 PID。

ps aux | grep sleep

你将看到类似这样的输出。确定 sleep 300 的 PID。例如,如果 PID 是 1234

labex       1234  0.0  0.0   2200   680 pts/0    S    HH:MM   0:00 sleep 300
labex       1235  0.0  0.0   2200   680 pts/0    S    HH:MM   0:00 sleep 301
labex       1236  0.0  0.0   2200   680 pts/0    S    HH:MM   0:00 sleep 302
labex       1237  0.0  0.0   6000  1000 pts/0    S+   HH:MM   0:00 grep sleep

要使用默认的 SIGTERM 信号终止 sleep 300,请使用 kill 后跟其 PID。将 1234 替换为实际找到的 PID:

kill 1234

你可能会看到一条消息,例如 [1]+ Terminated sleep 300。使用 jobsps aux | grep sleep 验证它已消失:

jobs
[2]- Running    sleep 301 &
[3]+ Running    sleep 302 &

现在,让我们使用 SIGKILL 强制终止 sleep 301。找到其 PID(例如,1235)并使用 kill -9kill -SIGKILL

kill -9 1235

你可能会看到 [2]- Killed sleep 301。再次验证:

jobs
[3]+ Running    sleep 302 &

使用 killall

killall 命令通过进程名称而不是 PID 来终止进程。它会向所有与指定命令名称匹配的进程发送信号。

让我们创建一些额外的 sleep 进程:

sleep 303 &
sleep 304 &
sleep 305 &

验证它们是否正在运行:

jobs
[3] Running    sleep 302 &
[4] Running    sleep 303 &
[5] Running    sleep 304 &
[6] Running    sleep 305 &

现在,使用 killall 终止所有 sleep 进程。默认情况下,killall 发送 SIGTERM

killall sleep

你将看到每个终止的 sleep 进程的消息。验证所有 sleep 进程是否已消失:

jobs
(no output)

使用 pkill

pkill 命令类似于 killall,但它提供了更高级的选择标准,包括命令名称、用户 ID、组 ID 和控制终端的模式匹配。它非常适合针对特定进程集。

让我们为 pkill 创建一些新的 sleep 进程:

sleep 306 &
sleep 307 &
sleep 308 &

验证它们是否正在运行:

jobs
[1] Running    sleep 306 &
[2] Running    sleep 307 &
[3] Running    sleep 308 &

要终止当前用户(labex)拥有的所有 sleep 进程,可以使用 pkill -u labex sleep

pkill -u labex sleep

此命令将终止属于 labex 用户的所有 sleep 进程。

验证所有 sleep 进程是否已消失:

jobs
(no output)

你还可以使用 pkill 与模式一起使用。例如,如果你有名为 my_app_v1my_app_v2 的进程,你可以使用 pkill my_app 终止两者。

这些命令提供了灵活的方式来管理和终止进程,从通过 PID 针对单个进程到基于名称或其他属性终止多个进程。在使用 kill -9SIGKILL 时,请务必谨慎,因为它可能会导致数据丢失,如果进程没有机会清理。

使用 uptime 和 lscpu 监控系统负载和 CPU 使用率

在本步骤中,你将学习如何使用 uptimelscpu 命令监控系统负载平均值和 CPU 使用率。理解这些指标对于评估系统性能和识别潜在瓶颈至关重要。

使用 uptime 理解负载平均值

uptime 命令提供系统运行时间、登录用户数量以及最重要的系统负载平均值的快速概述。负载平均值表示一段时间内处于可运行或不可中断状态的平均进程数量。

执行 uptime 命令:

uptime

你将看到类似这样的输出:

 HH:MM:SS up DD min,  X users,  load average: X.XX, X.XX, X.XX

让我们分解输出:

  • HH:MM:SS: 当前时间。
  • up DD min: 系统运行时间(运行时长)。
  • X users: 当前登录用户的数量。
  • load average: X.XX, X.XX, X.XX: 这三个数字分别表示过去 1 分钟、5 分钟和 15 分钟的系统负载平均值。

单核 CPU 的负载平均值为 1.00,表示 CPU 已完全使用。在多核 CPU 上,负载平均值等于 CPU 核心数,表示系统已完全使用。例如,在 4 核 CPU 上,负载平均值 4.00 表示完全使用。如果负载平均值持续超过 CPU 核心数,则表明你的系统负载过重,进程正在等待 CPU 时间。

使用 lscpu 确定 CPU 核心数

为了正确解释负载平均值,你需要知道系统有多少个逻辑 CPU 核心。lscpu 命令提供有关 CPU 架构的详细信息。

执行 lscpu 命令:

lscpu

你将看到大量的输出。查找 CPU(s): 行,它会告诉你可用的逻辑 CPU 总数。此外,Core(s) per socket:Socket(s): 可以帮助你理解物理布局。

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
...output omitted...

在上面的示例中,CPU(s): 4 表示该系统有 4 个逻辑 CPU 核心。

解释负载平均值和 CPU 核心数

让我们结合 uptimelscpu 的信息。假设你的 uptime 输出显示负载平均值为 2.92, 4.48, 5.20,而 lscpu 显示 CPU(s): 4

为了获得每个 CPU 的负载平均值,你需要将每个负载平均值除以逻辑 CPU 的总数:

  • 过去 1 分钟: 2.92 / 4 = 0.73
  • 过去 5 分钟: 4.48 / 4 = 1.12
  • 过去 15 分钟: 5.20 / 4 = 1.30

根据这些计算:

  • 在过去 1 分钟内,CPU 的利用率约为其容量的 73%。
  • 在过去 5 分钟内,系统负载过重约 12% (1.12 - 1.00 = 0.12)。这意味着进程正在等待 CPU 时间。
  • 在过去 15 分钟内,系统负载过重约 30% (1.30 - 1.00 = 0.30)。

此分析表明,在过去 5 分钟和 15 分钟内,系统负载非常高,但在过去 1 分钟内负载有所下降。这种趋势分析对于理解系统状况至关重要。

这两个命令 uptimelscpu 是简单而强大的工具,可快速评估 Linux 系统的整体健康状况和性能。

使用 top 命令分析进程活动

在本步骤中,你将深入学习如何使用 top 命令分析进程活动。虽然 top 提供实时概述,但它还提供强大的交互功能来排序、筛选和管理进程。

回想之前的步骤,top 提供系统动态视图。让我们再次启动 top

top

你将看到熟悉的 top 界面。顶部部分提供系统级统计信息,底部部分列出进程。

理解 top

让我们回顾进程列表中的默认列:

  • PID: 进程 ID。
  • USER: 进程所有者。
  • PR: 进程优先级。
  • NI: 进程的 nice 值(较低的 nice 值意味着较高的优先级)。
  • VIRT: 进程使用的虚拟内存。
  • RES: 进程使用的驻留内存(物理 RAM)。
  • SHR: 进程使用的共享内存。
  • S: 进程状态 (R=运行,S=睡眠,D=不可中断睡眠,T=停止,Z=僵尸)。
  • %CPU: 自上次更新以来 CPU 使用率百分比。
  • %MEM: 内存使用率百分比 (RES / 总物理内存)。
  • TIME+: 自进程启动以来使用的总 CPU 时间。
  • COMMAND: 启动进程的命令名称。

top 中的交互按键

top 具有高度的交互性。你可以按下各种按键来更改其显示并与进程交互。

  1. 排序进程:

    • Shift+P (大写 P) 按 CPU 使用率 (%CPU) 排序进程,这通常是默认行为。
    • Shift+M (大写 M) 按内存使用率 (%MEM) 排序进程。
    • Shift+T (大写 T) 按 TIME+ 排序进程。

    现在尝试按 Shift+M 按内存使用率排序。观察进程列表如何重新排序。然后按 Shift+P 返回按 CPU 使用率排序。

  2. 按用户筛选:

    • u (小写 u)。top 将提示你输入用户名。输入 labex 并按 Enter。
    • 现在,top 将只显示 labex 用户拥有的进程。这对于专注于你自己的进程非常有用。
    • 要清除筛选并再次显示所有用户,请按 u,然后在不输入用户名的情况下按 Enter。
  3. 更改更新间隔:

    • 默认情况下,top 每 3 秒更新一次。你可以更改此间隔。
    • s (小写 s)。top 将提示你输入延迟时间。输入 1 (表示 1 秒) 并按 Enter。
    • 观察显示如何更频繁地更新。
    • 你可以通过再次按 s 并输入 3 将其更改回 3 秒。
  4. 终止进程:

    • 你可以直接从 top 中终止进程。
    • 首先,在新的终端标签或窗口中创建一个后台 sleep 进程,或者在当前终端中按 Ctrl+Z,然后按 bgtop 放到后台,然后运行 sleep 600 &,然后按 fgtop 带回前台。
    • 或者,你可以打开一个新的终端标签(例如,在许多终端中使用 Ctrl+Shift+T)并在其中运行 sleep 600 &
    • 一旦你有一个正在运行的 sleep 进程,返回你的 top 终端。
    • k (小写 k)。top 将提示你输入要终止的进程的 PID。
    • top 列表中找到你的 sleep 600 进程的 PID。输入该 PID 并按 Enter。
    • top 将提示你发送的信号。默认是 15 (SIGTERM)。按 Enter 发送 SIGTERM
    • sleep 进程应该从列表中消失。如果它没有消失,你可以再次尝试 k 并发送信号 9 (SIGKILL)。
  5. 调整进程优先级:

    • 调整进程优先级会更改进程的优先级。较低的 nice 值意味着较高的优先级。
    • r (小写 r)。top 将提示输入 PID,然后输入 nice 值(例如,-10 表示更高优先级,10 表示更低优先级)。
    • 这是一个用于管理系统资源的高级功能。对于本实验,只需按 r,然后按两次 Enter 来取消操作,而不更改任何内容。
  6. 退出 top:

    • 完成后,按 q (小写 q) 退出 top 并返回你的终端提示符。

top 是系统管理员和用户都不可或缺的工具。掌握其交互功能可以快速有效地诊断系统性能问题和进程管理。

总结

在本实验中,你学习了 Linux 进程管理的基本概念。你首先使用 pstop 命令理解进程状态及其生命周期,观察进程如何在运行 (R)、可中断睡眠 (S) 和停止 (T) 等状态之间转换。你练习识别常见的进程状态,并解释 ps auxps -ef 的输出,从而深入了解系统进程。

此外,你探索了控制后台和前台作业的方法,这对于高效使用终端至关重要。你掌握了使用各种命令(例如 killkillallpkill)终止进程的方法,理解了它们在优雅终止或强制终止时的不同应用。最后,你学习了如何使用 uptimelscpu 监控系统负载和 CPU 使用率,以及如何使用 top 分析详细的进程活动,从而全面了解系统性能和资源利用情况。