实验 8:系统和进程监控¶
目标¶
完成本实验后,您将能够
- 查看和管理进程
- 杀死错误进程
- 更改进程优先级
估计完成本实验所需时间:60 分钟
介绍¶
这些练习涵盖了与监控和管理 Linux 系统上的进程相关的各种主题。涵盖的主题包括进程识别和控制、进程优先级管理、信号处理、资源监控和“cgroups”管理。
练习 1¶
ps
和 /proc 探索¶
探索并识别第一个系统进程¶
以任何用户身份登录系统。
使用 /proc 查找进程 ID 为 1 的进程的名称。
cat /proc/1/comm
问题
PID 为 1 的进程的名称是什么?
查看 PID 为 1 的进程的可执行文件背后的名称和路径。
ls -l /proc/1/exe
问题
PID 为 1 的可执行文件背后的路径是什么?
使用
ps
命令找出 PID 为 1 的进程或程序的名称。ps -p 1 -o comm=
问题
ps
命令是否确认了进程的名称?使用
ps
命令查看 PID 为 1 的进程或程序的完整路径和任何命令行参数。ps -p 1 -o args=
问题
PID 为 1 的进程的完整路径和命令行参数是什么?
问题
为什么 PID 为 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 和内存最多?
在
top
中按 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,使用
kill
命令结束进程。使用
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
问题
该进程现在是否在后台运行?
在
foobar1.txt
中的vi
编辑器中输入 "Hello"。通过按下 Ctrl+Z 暂停正在运行的
vi
文本编辑会话。启动另一个独立的
vi
编辑器会话以创建另一个名为 "foobar2.txt" 的文本文件。输入vi foobar2.txt
在第二个 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。使用
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
强制终止所有具有特定名称的进程。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
强制终止所有具有特定名称的进程。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