跳至内容

实验 8:系统和进程监控

目标

完成本实验后,您将能够

  • 查看和管理进程
  • 杀死错误进程
  • 更改进程优先级

估计完成本实验所需时间:60 分钟

介绍

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

练习 1

ps 和 /proc 探索

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

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

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

    cat /proc/1/comm
    

    问题

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

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

    ls -l /proc/1/exe
    

    问题

    PID 为 1 的可执行文件背后的路径是什么?

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

    ps -p 1 -o comm=
    

    问题

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

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

    ps -p 1 -o args=
    

    问题

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

    问题

    为什么 PID 为 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. top 中按 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,使用 kill 命令结束进程。

  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 值(即对进程最不友好或更低优先级)。使用 nice19 输入

     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. foobar1.txt 中的 vi 编辑器中输入 "Hello"。

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

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

    vi foobar2.txt
    
  5. 在第二个 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。

  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 强制终止所有具有特定名称的进程。

    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 强制终止所有具有特定名称的进程。

     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