实验 8:系统和进程监控¶
目标¶
完成此实验后,您将能够
- 查看和管理进程
- 杀死异常进程
- 更改进程优先级
完成此实验的估计时间:60 分钟
简介¶
这些练习涵盖了监控和管理 Linux 系统进程的各种主题。涵盖的主题包括进程识别和控制、进程优先级管理、信号处理、资源监控和“cgroups”管理。
练习 1¶
ps
和 /proc 探索¶
探索并识别第一个系统进程¶
-
以任何用户身份登录系统。
-
使用 /proc 查找进程 ID 为 1 的进程名称。
cat /proc/1/comm
问题
进程 ID 为 1 的进程名称是什么?
-
查看进程 ID 为 1 的进程背后的名称和可执行文件路径。
ls -l /proc/1/exe
问题
进程 ID 为 1 的可执行文件路径是什么?
-
使用
ps
命令查找进程 ID 为 1 的进程或程序名称。ps -p 1 -o comm=
问题
ps
命令是否确认了进程名称? -
使用
ps
命令查看进程 ID 为 1 的进程或程序后面的完整路径和任何命令行参数。ps -p 1 -o args=
问题
进程 ID 为 1 的进程的完整路径和命令行参数是什么?
问题
为什么进程 ID 为 1 在 Linux 系统上很重要?
使用 ps
显示详细进程信息¶
以下步骤将展示如何使用 ps
显示基本的进程信息。
-
使用
ps
命令以树状结构显示所有进程的列表。ps auxf
问题
进程列表的结构是什么?显示了哪些信息?
-
仅筛选列表以显示与特定用户关联的进程,例如用户“root”。
ps -U root
确认只显示了 root 用户的进程。
-
以详细格式显示进程,包括进程树和线程。输入
ps -eH
问题
在此格式中显示了哪些附加详细信息?
-
按 CPU 使用率降序显示进程。
ps aux --sort=-%cpu
问题
哪个进程占用的 CPU 最多?
练习 2¶
使用 kill
管理进程¶
使用 kill
终止进程¶
-
在后台启动一个长时间运行的 sleep 进程,并在终端上显示 PID。输入
(sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null
输出
PID is: 1331933
记下您系统中新进程的 PID。PID 也保存在 $MYPROC1 变量中。
-
向
sleep
进程发送终止信号 (SIGTERM)。kill $MYPROC1
将 $MYPROC1 替换为步骤 1 中的实际 PID。
-
使用
ps
和ps aux
检查进程是否已被终止。ps aux | grep -v grep | grep sleep
使用 kill
信号终止进程¶
-
启动一个新的 sleep 进程并记下其 PID。输入
(sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null
输出
PID is: 1333258
-
向新的 sleep 进程发送不同的信号(例如 SIGHUP)。输入
kill -1 $MYPROC2
确认 $MYPROC2 不再进程表中。
-
启动一个新的 ping 进程并记下其 PID。输入
{ ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \ 2>/dev/null; echo "PID is: $MYPROC3"
-
使用
kill
命令向 ping 进程发送SIGTERM
信号。输入kill -15 $MYPROC3
将 MYPROC3 替换为您系统中该进程的实际 PID。
-
使用
cat
命令启动一个长时间运行的进程。输入{ cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \ 2>/dev/null; echo PID is: $MYPROC4
记下您系统中该进程的 PID。
-
使用
kill
通过发送 SIGKILL 信号强制终止进程。kill -9 $MYPROC4
确认进程已被终止。
问题
解释使用
kill
命令向进程发送信号的目的以及不同信号类型的意义。
练习 3¶
使用 top
监控系统资源¶
使用 top
监控系统资源使用情况¶
-
启动 top 命令以查看实时系统统计信息。
top
问题
top 界面显示了哪些信息?
-
观察 top 界面中进程的 CPU 和内存使用情况。
问题
哪些进程占用的 CPU 和内存最多?
-
按 CPU 使用率排序(按 P)和按内存使用率排序(按 M)进程。
问题
排序后,占用 CPU 和内存最多的前几个进程是什么?
使用 top
监控特定进程的 CPU 和内存使用情况¶
-
创建一个包含随机数据的任意大小的 512MB 文件。
sudo fallocate -l 512M ~/large-file.data
-
启动一个资源密集型进程,例如大文件压缩。
tar -czf archive.tar.gz /path/to/large/directory
-
打开
top
命令以监控 CPU 和内存使用情况。top
-
在 top 界面中查找并选择资源密集型进程。
问题
密集型进程的进程 ID 和资源利用率是多少?
-
更改
top
中的排序顺序,以显示使用最多 CPU 或内存的进程(按 P 或 M)。问题
排序后,列表顶部的进程是什么?
-
按
q
键退出top
。
使用 top
监控进程和资源使用情况¶
-
以交互模式启动
top
命令。top
问题
top 屏幕上显示了哪些信息?
-
使用 1 键显示每个 CPU 核心使用情况的摘要。
问题
每个核心的 CPU 核心使用情况明细是什么?
-
按 u 显示特定用户的进程。输入您的用户名。
问题
您的用户当前正在运行哪些进程?
-
按内存使用率排序进程(按 M),并观察占用内存最多的进程。
问题
哪些进程占用的内存最多?
-
按 q 键退出 top。
问题
解释使用
top
命令监控系统资源的重要性,以及它如何帮助排除性能问题。
练习 4¶
使用 nice
和 renice
更改进程优先级¶
使用 nice
调整进程优先级¶
-
启动一个 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 值。
-
使用您进程的 PID,在另一个终端中使用
ps
命令检查进程的默认优先级。输入ps -p <PID> -o ni
问题
正在运行进程的默认进程优先级(
nice
值)是多少? -
使用打印的进程 PID 终止该进程。
-
使用
nice
命令,使用较低的 niceness 值(即对进程更有利/优先级更高)重新启动一个类似进程。使用nice
值为-20
。输入nice -n -20 bash -c 'while true; do echo "High priority: The PID is $$"; done'
-
使用您的 PID 值,使用
ps
命令检查进程的优先级。输入ps -p <PID> -o ni
问题
进程优先级是否已成功设置?
-
同时按下键盘上的 Ctrl+C 键以
kill
新的高优先级进程。 -
再次使用
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>...
-
使用
ps
命令检查进程的自定义优先级。输入ps -p <PID> -o ni
-
同时按下键盘上的 Ctrl+C 键以杀死新的低优先级进程。
-
尝试更改不同进程的优先级到更高和更低的值,并观察对进程资源使用情况的影响。
使用 renice
调整正在运行进程的优先级¶
-
启动一个 CPU 密集型进程,例如使用 md5sum 工具进行长时间的数学计算。输入
find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null
-
使用
ps
命令找出上一个find/md5sum
进程的 PID。输入ps -C find -o pid=
输出
2577072
从输出中,我们示例系统上的 PID 值是
2577072
。您系统上的 PID 值将不同。
记下您系统上的 PID 值。
-
使用
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。 -
使用
top
(或htop
)监控find/md5sum
进程的资源利用率。输入top -cp $(ps -C find -o pid=)
问题
该进程现在是否获得更高的 CPU 资源份额?
-
将
find/md5sum
进程的优先级更改为较高的nice
值(例如,10,较低优先级)。输入renice -n 10 -p <PID>
输出
2338530 (process ID) old priority -10, new priority 10
将
<PID>
(上方)替换为正在运行进程的实际 PID。问题
解释
nice
命令如何用于调整进程优先级,以及它如何影响系统资源分配。 -
同时按下键盘上的 Ctrl+C 键停止
find/md5sum
进程。您也可以使用kill
命令完成相同的操作。
练习 5¶
使用 pgrep
识别进程¶
使用 pgrep
按名称查找进程¶
-
使用
pgrep
命令识别与特定程序或服务(例如sshd
)关联的所有进程。pgrep sshd
问题
sshd
进程的进程 ID 是什么? -
使用
ps
命令验证已识别进程的存在。ps -p <PID1,PID2,...>
替换“
”为从步骤 1 获得的进程 ID。 -
使用
pgrep
命令识别具有特定名称的进程,例如“cron”。pgrep cron
问题
是否有名称为“cron”的进程?
问题
解释使用
ps
和pgrep
识别和管理进程的区别。
练习 6¶
前台和后台进程¶
本练习涵盖使用 fg
和 bg
管理进程
使用 bg
和 fg
管理后台和前台进程¶
-
在前台启动一个长时间运行的进程。例如,您可以使用一个简单的命令,如
sleep
。输入sleep 300
-
按键盘上的 Ctrl+Z 挂起前台进程。这应该会让您返回到 shell 提示符。
-
使用
jobs
命令列出挂起的作业。输入jobs
问题
挂起作业的状态是什么?
-
使用
fg
命令将挂起的作业带回前台。fg
问题
将作业带回前台时会发生什么?
-
再次使用 Ctrl+Z 挂起作业,然后使用
bg
命令将其移至后台。bg
问题
现在作业的状态是什么?
问题
解释前台和后台进程的目的,以及如何使用
fg
和bg
命令进行管理。
在后台启动进程¶
-
&
符号可以启动一个立即在后台运行的进程。例如,要在后台启动sleep
命令,请输入sleep 300 &
使用 Ctrl+Z 挂起正在运行的进程。
-
列出所有活动作业的状态。输入
jobs -l
问题
sleep 300
进程的状态是什么? -
使用
fg
命令将后台进程带回前台。fg
-
通过按 Ctrl+C 发送 SIGSTOP 信号,提前结束
sleep
进程。
使用 bg
和 fg
管理交互式进程¶
-
启动一个交互式进程,例如
vi
文本编辑器,以创建和编辑名为“foobar.txt”的示例文本文件。输入vi foobar1.txt
使用
Ctrl
+Z
挂起正在运行的进程。使用
bg
命令将挂起的进程移至后台。bg
问题
进程现在是否在后台运行?
-
在您的
vi
编辑器中,在foobar1.txt
中输入“Hello”。 -
通过按 Ctrl+Z 挂起正在运行的
vi
文本编辑会话。 -
启动另一个单独的
vi
编辑器会话,以创建另一个名为“foobar2.txt”的文本文件。输入vi foobar2.txt
-
在 2nd vi 会话中输入示例文本“Hi inside foobar2.txt”。
-
使用 Ctrl+Z 挂起第二个 vi 会话。
-
列出当前终端上所有
jobs
的状态。输入jobs -l
输出
[1]- 2977364 Stopped vi foobar1.txt [2]+ 2977612 Stopped vi foobar2.txt
您的输出中应至少列出 2 个作业。输出第一列中的数字显示作业编号 - [1] 和 [2]。
-
键入以下命令,恢复 并带到前台第一个
vi
会话fg %1
-
再次使用 Ctrl+Z 挂起第一个
vi
会话。 -
键入以下命令,恢复 并带到前台第二个
vi
会话fg %2
-
通过向两个作业发送 KILL 信号,无条件终止两个
vi
编辑会话。在kill
命令后跟 jobs 命令。输入kill -SIGKILL %1 %2 && jobs
输出
[1]- Killed vi foobar1.txt [2]+ Killed vi foobar2.txt
练习 7¶
使用 pidof
进行进程识别¶
使用 pidof
查找正在运行命令的进程 ID¶
-
我们来选择一个正在运行的示例/常用进程,其进程 ID 我们想找到。我们将以
systemd
为例。 -
使用
pidof
命令查找systemd
的进程 ID。输入pidof systemd
记下
systemd
的进程 ID(s)。 -
使用
ps
命令验证已识别进程的存在。ps -p <PID>
将
<PID>
替换为从步骤 2 获得的实际进程 ID。问题
解释
pgrep
和pidof
在查找正在运行命令的进程 ID 方面的区别。
练习 8¶
探索 /sys 文件系统¶
探索 /sys 文件系统¶
-
列出 /sys 目录的内容。输入
ls /sys
问题
/sys 目录中存储了什么类型的信息?
-
导航到特定的 /sys 条目,例如 CPU 信息。
cd /sys/devices/system/cpu
-
列出当前目录的内容以探索 CPU 相关信息。
ls
问题
/sys 文件系统中提供了哪些 CPU 相关信息?
问题
解释 /sys 文件系统在 Linux 中的作用,以及它在管理系统硬件和配置中的作用。
练习 9¶
使用 pkill
按名称杀死进程¶
使用 pkill
按名称终止进程¶
-
识别具有特定名称的进程,例如“firefox”。
pkill firefox
问题
名称为“firefox”的所有进程是否都已终止?
-
使用
ps
检查您所杀死进程的状态。ps aux | grep firefox
问题
是否还有名称为“firefox”的进程剩余?
使用
pkill
强制终止所有名称为“firefox”的进程。pkill -9 firefox
确认名称为“firefox”的所有进程现已终止。
问题
使用
kill
和pkill
按名称终止进程有什么区别?
练习 10¶
本练习涵盖使用强大的 exec
命令。
使用 exec
进行进程控制¶
使用 exec
将当前 shell 替换为另一个命令¶
-
启动一个新的 shell 会话。输入
bash
-
运行一个不退出的命令在新 shell 中,例如一个简单的 while 循环。
while true; do echo "Running..."; done
-
在当前 shell 中,使用
exec
将正在运行的命令替换为另一个命令。exec echo "This replaces the previous command."
请注意,之前的命令已被终止,新的命令正在运行。
-
使用
ps
确认旧命令不再运行。ps aux | grep "while true"
问题
之前的命令是否仍在运行?
问题
解释
exec
命令如何用另一个命令替换当前的 shell 进程。
练习 11¶
使用 killall
管理进程¶
与 kill
一样,killall
是一个按名称而不是 PID 终止进程的命令。在 killall
、kill
和 pkill
的用法之间可以看到一些相似之处,用于进程终止。
使用 killall
按名称终止进程¶
-
识别具有特定名称的进程,例如“chrome”。
killall chrome
问题
名称为“chrome”的所有进程是否都已终止?
-
使用
ps
检查您所杀死进程的状态。ps aux | grep chrome
问题
是否还有名称为“chrome”的进程剩余?
-
使用
killall
强制终止所有名称为“chrome”的进程。killall -9 chrome
确认名称为“chrome”的所有进程现已终止。
问题
在按名称终止进程时,
killall
与pkill
和kill
有何不同?
练习 12¶
cgroups
管理¶
使用 cgroups
管理进程¶
-
列出系统上已存在的
cgroups
。cat /proc/cgroups
问题
系统上有哪些
cgroup
控制器可用? -
使用 CPU 控制器创建一个新的 cgroup。将其命名为“mygroup”。
sudo mkdir -p /sys/fs/cgroup/cpu/mygroup
-
将特定进程(例如,正在运行的 sleep 命令)移动到“mygroup”
cgroup
。echo <PID> | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs
将
<PID>
替换为进程的实际 PID。 -
检查进程是否已移动到“mygroup”
cgroup
。cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs
问题
进程是否列在“mygroup” cgroup 中?
问题
解释 Linux 中
cgroups
的概念,以及它们如何管理和控制进程的资源分配。
练习 13¶
使用 renice
管理进程¶
使用 renice
调整正在运行进程的优先级¶
-
使用
ps
识别具有特定 PID 和优先级的正在运行的进程。ps -p <PID> -o ni
问题
该进程当前的优先级(nice 值)是多少?
-
使用
renice
命令更改正在运行进程的优先级(nice 值)。renice <PRIORITY> -p <PID>
将
<PRIORITY>
替换为您要设置的新优先级值,并将<PID>
替换为进程的实际 PID。 -
使用
ps
验证进程的优先级是否已更改。ps -p <PID> -o ni
问题
优先级现在是否不同?
-
尝试将优先级更改为更高和更低的值,并观察对进程资源使用情况的影响。
问题
不同 nice 值下进程的资源消耗情况如何?
问题
解释 renice 命令如何用于调整正在运行进程的优先级,以及它对进程资源利用率的影响。
作者:Wale Soyinka
贡献者:Steven Spencer, Ganna Zhyrnova