跳至内容

实验 8:系统和进程监控

目标

完成此实验后,您将能够

  • 查看和管理进程
  • 杀死异常进程
  • 更改进程优先级

完成此实验的估计时间:60 分钟

简介

这些练习涵盖了监控和管理 Linux 系统进程的各种主题。涵盖的主题包括进程识别和控制、进程优先级管理、信号处理、资源监控和“cgroups”管理。

练习 1

ps 和 /proc 探索

探索并识别第一个系统进程

  1. 以任何用户身份登录系统。

  2. 使用 /proc 查找进程 ID 为 1 的进程名称。

    cat /proc/1/comm
    

    问题

    进程 ID 为 1 的进程名称是什么?

  3. 查看进程 ID 为 1 的进程背后的名称和可执行文件路径。

    ls -l /proc/1/exe
    

    问题

    进程 ID 为 1 的可执行文件路径是什么?

  4. 使用 ps 命令查找进程 ID 为 1 的进程或程序名称。

    ps -p 1 -o comm=
    

    问题

    ps 命令是否确认了进程名称?

  5. 使用 ps 命令查看进程 ID 为 1 的进程或程序后面的完整路径和任何命令行参数。

    ps -p 1 -o args=
    

    问题

    进程 ID 为 1 的进程的完整路径和命令行参数是什么?

    问题

    为什么进程 ID 为 1 在 Linux 系统上很重要?

使用 ps 显示详细进程信息

以下步骤将展示如何使用 ps 显示基本的进程信息。

  1. 使用 ps 命令以树状结构显示所有进程的列表。

    ps auxf
    

    问题

    进程列表的结构是什么?显示了哪些信息?

  2. 仅筛选列表以显示与特定用户关联的进程,例如用户“root”。

    ps -U root
    

    确认只显示了 root 用户的进程。

  3. 以详细格式显示进程,包括进程树和线程。输入

    ps -eH
    

    问题

    在此格式中显示了哪些附加详细信息?

  4. 按 CPU 使用率降序显示进程。

    ps aux --sort=-%cpu
    

    问题

    哪个进程占用的 CPU 最多?

练习 2

使用 kill 管理进程

使用 kill 终止进程

  1. 在后台启动一个长时间运行的 sleep 进程,并在终端上显示 PID。输入

    (sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null
    

    输出

    PID is: 1331933
    

    记下您系统中新进程的 PID。PID 也保存在 $MYPROC1 变量中。

  2. sleep 进程发送终止信号 (SIGTERM)。

    kill $MYPROC1
    

    将 $MYPROC1 替换为步骤 1 中的实际 PID。

  3. 使用 psps aux 检查进程是否已被终止。

    ps aux | grep -v grep | grep sleep
    

使用 kill 信号终止进程

  1. 启动一个新的 sleep 进程并记下其 PID。输入

    (sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null
    

    输出

    PID is: 1333258
    
  2. 向新的 sleep 进程发送不同的信号(例如 SIGHUP)。输入

    kill -1 $MYPROC2
    

    确认 $MYPROC2 不再进程表中。

  3. 启动一个新的 ping 进程并记下其 PID。输入

    { ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \
        2>/dev/null; echo "PID is: $MYPROC3"
    
  4. 使用 kill 命令向 ping 进程发送 SIGTERM 信号。输入

    kill -15 $MYPROC3
    

    将 MYPROC3 替换为您系统中该进程的实际 PID。

  5. 使用 cat 命令启动一个长时间运行的进程。输入

    { cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \
     2>/dev/null; echo PID is: $MYPROC4
    

    记下您系统中该进程的 PID。

  6. 使用 kill 通过发送 SIGKILL 信号强制终止进程。

    kill -9 $MYPROC4
    

    确认进程已被终止。

    问题

    解释使用 kill 命令向进程发送信号的目的以及不同信号类型的意义。

练习 3

使用 top 监控系统资源

使用 top 监控系统资源使用情况

  1. 启动 top 命令以查看实时系统统计信息。

    top
    

    问题

    top 界面显示了哪些信息?

  2. 观察 top 界面中进程的 CPU 和内存使用情况。

    问题

    哪些进程占用的 CPU 和内存最多?

  3. 按 CPU 使用率排序(按 P)和按内存使用率排序(按 M)进程。

    问题

    排序后,占用 CPU 和内存最多的前几个进程是什么?

使用 top 监控特定进程的 CPU 和内存使用情况

  1. 创建一个包含随机数据的任意大小的 512MB 文件。

    sudo fallocate -l 512M  ~/large-file.data
    
  2. 启动一个资源密集型进程,例如大文件压缩。

     tar -czf archive.tar.gz /path/to/large/directory
    
  3. 打开 top 命令以监控 CPU 和内存使用情况。

     top
    
  4. 在 top 界面中查找并选择资源密集型进程。

    问题

    密集型进程的进程 ID 和资源利用率是多少?

  5. 更改 top 中的排序顺序,以显示使用最多 CPU 或内存的进程(按 P 或 M)。

    问题

    排序后,列表顶部的进程是什么?

  6. q 键退出 top

使用 top 监控进程和资源使用情况

  1. 以交互模式启动 top 命令。

    top
    

    问题

    top 屏幕上显示了哪些信息?

  2. 使用 1 键显示每个 CPU 核心使用情况的摘要。

    问题

    每个核心的 CPU 核心使用情况明细是什么?

  3. 按 u 显示特定用户的进程。输入您的用户名。

    问题

    您的用户当前正在运行哪些进程?

  4. 按内存使用率排序进程(按 M),并观察占用内存最多的进程。

    问题

    哪些进程占用的内存最多?

  5. q 键退出 top。

    问题

    解释使用 top 命令监控系统资源的重要性,以及它如何帮助排除性能问题。

练习 4

使用 nicerenice 更改进程优先级

使用 nice 调整进程优先级

  1. 启动一个 CPU 密集型进程,该进程以默认/正常优先级运行。输入

    bash -c  'while true; do echo "Default priority: The PID is $$"; done'
    

    输出

    Default priority: The PID is 2185209
    Default priority: The PID is 2185209
    Default priority: The PID is 2185209
    ....<SNIP>...
    

    从输出中,我们示例系统上的 PID 值是 2185209

    您系统上的 PID 值将不同。

    记下您系统上屏幕上连续显示的 PID 值。

  2. 使用您进程的 PID,在另一个终端中使用 ps 命令检查进程的默认优先级。输入

    ps -p <PID> -o ni
    

    问题

    正在运行进程的默认进程优先级(nice 值)是多少?

  3. 使用打印的进程 PID 终止该进程。

  4. 使用 nice 命令,使用较低的 niceness 值(即对进程更有利/优先级更高)重新启动一个类似进程。使用 nice 值为 -20。输入

    nice -n -20 bash -c  'while true; do echo "High priority: The PID is $$"; done'
    
  5. 使用您的 PID 值,使用 ps 命令检查进程的优先级。输入

    ps -p <PID> -o ni
    

    问题

    进程优先级是否已成功设置?

  6. 同时按下键盘上的 Ctrl+C 键以 kill 新的高优先级进程。

  7. 再次使用 nice 命令重新启动另一个进程,但这次使用较高的 niceness 值(即对进程最不利/优先级较低)。使用 nice 值为 19。输入

     nice -n 19 bash -c  'while true; do echo "Low priority: The PID is $$"; done'
    

    输出

    Low priority: The PID is 2180254
    Low priority: The PID is 2180254
    ...<SNIP>...
    
  8. 使用 ps 命令检查进程的自定义优先级。输入

    ps -p <PID> -o ni
    
  9. 同时按下键盘上的 Ctrl+C 键以杀死新的低优先级进程。

  10. 尝试更改不同进程的优先级到更高和更低的值,并观察对进程资源使用情况的影响。

使用 renice 调整正在运行进程的优先级

  1. 启动一个 CPU 密集型进程,例如使用 md5sum 工具进行长时间的数学计算。输入

    find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null
    
  2. 使用 ps 命令找出上一个 find/md5sum 进程的 PID。输入

    ps -C find -o pid=
    

    输出

    2577072
    

    从输出中,我们示例系统上的 PID 值是 2577072

    您系统上的 PID 值将不同。

    记下您系统上的 PID 值。

  3. 使用 renice 命令将正在运行的 find/md5sum 进程的优先级调整为较低的 niceness 值(例如,-10,更高优先级)。输入

    renice  -n -10 -p $(ps -C find -o pid=)
    

    输出

    <PID> (process ID) old priority 0, new priority -10
    

    <PID>(上方)替换为正在运行进程的实际 PID。

  4. 使用 top(或 htop)监控 find/md5sum 进程的资源利用率。输入

    top -cp $(ps -C find -o pid=)
    

    问题

    该进程现在是否获得更高的 CPU 资源份额?

  5. find/md5sum 进程的优先级更改为较高的 nice 值(例如,10,较低优先级)。输入

    renice  -n 10 -p <PID>
    

    输出

    2338530 (process ID) old priority -10, new priority 10
    

    <PID>(上方)替换为正在运行进程的实际 PID。

    问题

    解释 nice 命令如何用于调整进程优先级,以及它如何影响系统资源分配。

  6. 同时按下键盘上的 Ctrl+C 键停止 find/md5sum 进程。您也可以使用 kill 命令完成相同的操作。

练习 5

使用 pgrep 识别进程

使用 pgrep 按名称查找进程

  1. 使用 pgrep 命令识别与特定程序或服务(例如 sshd)关联的所有进程。

    pgrep sshd
    

    问题

    sshd 进程的进程 ID 是什么?

  2. 使用 ps 命令验证已识别进程的存在。

     ps -p <PID1,PID2,...>
    

    替换“”为从步骤 1 获得的进程 ID。

  3. 使用 pgrep 命令识别具有特定名称的进程,例如“cron”。

    pgrep cron
    

    问题

    是否有名称为“cron”的进程?

    问题

    解释使用 pspgrep 识别和管理进程的区别。

练习 6

前台和后台进程

本练习涵盖使用 fgbg 管理进程

使用 bgfg 管理后台和前台进程

  1. 在前台启动一个长时间运行的进程。例如,您可以使用一个简单的命令,如 sleep。输入

    sleep 300
    
  2. 按键盘上的 Ctrl+Z 挂起前台进程。这应该会让您返回到 shell 提示符。

  3. 使用 jobs 命令列出挂起的作业。输入

    jobs
    

    问题

    挂起作业的状态是什么?

  4. 使用 fg 命令将挂起的作业带回前台。

    fg
    

    问题

    将作业带回前台时会发生什么?

  5. 再次使用 Ctrl+Z 挂起作业,然后使用 bg 命令将其移至后台。

    bg
    

    问题

    现在作业的状态是什么?

    问题

    解释前台和后台进程的目的,以及如何使用 fgbg 命令进行管理。

在后台启动进程

  1. & 符号可以启动一个立即在后台运行的进程。例如,要在后台启动 sleep 命令,请输入

    sleep 300 &
    

    使用 Ctrl+Z 挂起正在运行的进程。

  2. 列出所有活动作业的状态。输入

    jobs -l
    

    问题

    sleep 300 进程的状态是什么?

  3. 使用 fg 命令将后台进程带回前台。

    fg
    
  4. 通过按 Ctrl+C 发送 SIGSTOP 信号,提前结束 sleep 进程。

使用 bgfg 管理交互式进程

  1. 启动一个交互式进程,例如 vi 文本编辑器,以创建和编辑名为“foobar.txt”的示例文本文件。输入

    vi foobar1.txt
    

    使用 Ctrl + Z 挂起正在运行的进程。

    使用 bg 命令将挂起的进程移至后台。

    bg
    

    问题

    进程现在是否在后台运行?

  2. 在您的 vi 编辑器中,在 foobar1.txt 中输入“Hello”。

  3. 通过按 Ctrl+Z 挂起正在运行的 vi 文本编辑会话。

  4. 启动另一个单独的 vi 编辑器会话,以创建另一个名为“foobar2.txt”的文本文件。输入

    vi foobar2.txt
    
  5. 在 2nd vi 会话中输入示例文本“Hi inside foobar2.txt”。

  6. 使用 Ctrl+Z 挂起第二个 vi 会话。

  7. 列出当前终端上所有 jobs 的状态。输入

    jobs -l
    

    输出

    [1]- 2977364 Stopped       vi foobar1.txt
    [2]+ 2977612 Stopped       vi foobar2.txt
    

    您的输出中应至少列出 2 个作业。输出第一列中的数字显示作业编号 - [1] 和 [2]。

  8. 键入以下命令,恢复 并带到前台第一个 vi 会话

    fg %1
    
  9. 再次使用 Ctrl+Z 挂起第一个 vi 会话。

  10. 键入以下命令,恢复 并带到前台第二个 vi 会话

    fg %2
    
  11. 通过向两个作业发送 KILL 信号,无条件终止两个 vi 编辑会话。在 kill 命令后跟 jobs 命令。输入

     kill -SIGKILL  %1 %2 && jobs
    

    输出

    [1]-  Killed                  vi foobar1.txt
    [2]+  Killed                  vi foobar2.txt
    

练习 7

使用 pidof 进行进程识别

使用 pidof 查找正在运行命令的进程 ID

  1. 我们来选择一个正在运行的示例/常用进程,其进程 ID 我们想找到。我们将以 systemd 为例。

  2. 使用 pidof 命令查找 systemd 的进程 ID。输入

    pidof systemd
    

    记下 systemd 的进程 ID(s)。

  3. 使用 ps 命令验证已识别进程的存在。

    ps -p <PID>
    

    <PID> 替换为从步骤 2 获得的实际进程 ID。

    问题

    解释 pgreppidof 在查找正在运行命令的进程 ID 方面的区别。

练习 8

探索 /sys 文件系统

探索 /sys 文件系统

  1. 列出 /sys 目录的内容。输入

    ls /sys
    

    问题

    /sys 目录中存储了什么类型的信息?

  2. 导航到特定的 /sys 条目,例如 CPU 信息。

    cd /sys/devices/system/cpu
    
  3. 列出当前目录的内容以探索 CPU 相关信息。

    ls
    

    问题

    /sys 文件系统中提供了哪些 CPU 相关信息?

    问题

    解释 /sys 文件系统在 Linux 中的作用,以及它在管理系统硬件和配置中的作用。

练习 9

使用 pkill 按名称杀死进程

使用 pkill 按名称终止进程

  1. 识别具有特定名称的进程,例如“firefox”。

    pkill firefox
    

    问题

    名称为“firefox”的所有进程是否都已终止?

  2. 使用 ps 检查您所杀死进程的状态。

     ps aux | grep firefox
    

    问题

    是否还有名称为“firefox”的进程剩余?

    使用 pkill 强制终止所有名称为“firefox”的进程。

    pkill -9 firefox
    

    确认名称为“firefox”的所有进程现已终止。

    问题

    使用 killpkill 按名称终止进程有什么区别?

练习 10

本练习涵盖使用强大的 exec 命令。

使用 exec 进行进程控制

使用 exec 将当前 shell 替换为另一个命令

  1. 启动一个新的 shell 会话。输入

    bash
    
  2. 运行一个不退出的命令在新 shell 中,例如一个简单的 while 循环。

     while true; do echo "Running..."; done
    
  3. 在当前 shell 中,使用 exec 将正在运行的命令替换为另一个命令。

     exec echo "This replaces the previous command."
    

    请注意,之前的命令已被终止,新的命令正在运行。

  4. 使用 ps 确认旧命令不再运行。

    ps aux | grep "while true"
    

    问题

    之前的命令是否仍在运行?

    问题

    解释 exec 命令如何用另一个命令替换当前的 shell 进程。

练习 11

使用 killall 管理进程

kill 一样,killall 是一个按名称而不是 PID 终止进程的命令。在 killallkillpkill 的用法之间可以看到一些相似之处,用于进程终止。

使用 killall 按名称终止进程

  1. 识别具有特定名称的进程,例如“chrome”。

     killall chrome
    

    问题

    名称为“chrome”的所有进程是否都已终止?

  2. 使用 ps 检查您所杀死进程的状态。

     ps aux | grep chrome
    

    问题

    是否还有名称为“chrome”的进程剩余?

  3. 使用 killall 强制终止所有名称为“chrome”的进程。

     killall -9 chrome
    

    确认名称为“chrome”的所有进程现已终止。

    问题

    在按名称终止进程时,killallpkillkill 有何不同?

练习 12

cgroups 管理

使用 cgroups 管理进程

  1. 列出系统上已存在的 cgroups

    cat /proc/cgroups
    

    问题

    系统上有哪些 cgroup 控制器可用?

  2. 使用 CPU 控制器创建一个新的 cgroup。将其命名为“mygroup”。

    sudo mkdir -p /sys/fs/cgroup/cpu/mygroup
    
  3. 将特定进程(例如,正在运行的 sleep 命令)移动到“mygroup” cgroup

    echo <PID> | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs
    

    <PID> 替换为进程的实际 PID。

  4. 检查进程是否已移动到“mygroup” cgroup

    cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs
    

    问题

    进程是否列在“mygroup” cgroup 中?

    问题

    解释 Linux 中 cgroups 的概念,以及它们如何管理和控制进程的资源分配。

练习 13

使用 renice 管理进程

使用 renice 调整正在运行进程的优先级

  1. 使用 ps 识别具有特定 PID 和优先级的正在运行的进程。

    ps -p <PID> -o ni
    

    问题

    该进程当前的优先级(nice 值)是多少?

  2. 使用 renice 命令更改正在运行进程的优先级(nice 值)。

    renice <PRIORITY> -p <PID>
    

    <PRIORITY> 替换为您要设置的新优先级值,并将 <PID> 替换为进程的实际 PID。

  3. 使用 ps 验证进程的优先级是否已更改。

    ps -p <PID> -o ni
    

    问题

    优先级现在是否不同?

  4. 尝试将优先级更改为更高和更低的值,并观察对进程资源使用情况的影响。

    问题

    不同 nice 值下进程的资源消耗情况如何?

    问题

    解释 renice 命令如何用于调整正在运行进程的优先级,以及它对进程资源利用率的影响。

作者:Wale Soyinka

贡献者:Steven Spencer, Ganna Zhyrnova