简介
进程管理是 Linux 系统管理的一个基本方面。你在 Linux 中运行的每个程序或命令都会创建一个进程,监控这些进程对于维护系统性能和解决问题至关重要。
本实验将指导你掌握 ps
命令,这是一个用于监控和管理 Linux 系统上运行的进程的强大工具。通过了解如何使用 ps
命令及其各种选项,你将能够随时深入了解系统中正在发生的情况。
在整个实验过程中,你将学习如何以不同格式显示进程、查看所有系统进程,以及理解 ps
可以提供的关于每个进程的详细信息。
进程管理是 Linux 系统管理的一个基本方面。你在 Linux 中运行的每个程序或命令都会创建一个进程,监控这些进程对于维护系统性能和解决问题至关重要。
本实验将指导你掌握 ps
命令,这是一个用于监控和管理 Linux 系统上运行的进程的强大工具。通过了解如何使用 ps
命令及其各种选项,你将能够随时深入了解系统中正在发生的情况。
在整个实验过程中,你将学习如何以不同格式显示进程、查看所有系统进程,以及理解 ps
可以提供的关于每个进程的详细信息。
在 Linux 中,每个正在运行的程序或命令都由一个进程表示。每个进程都有一个唯一的标识符,称为进程 ID(Process ID,PID)。ps
命令允许你查看这些进程并获取有关它们的信息。
让我们从探索 ps
命令的基本用法开始。
在 LabEx 环境中打开你的终端。你应该从 ~/project
目录开始。
输入以下命令并按回车键:
ps
PID TTY TIME CMD
188 pts/0 00:00:00 zsh
449 pts/0 00:00:00 ps
让我们来理解这个输出的含义:
PID
:进程 ID,分配给每个进程的唯一编号TTY
:终端类型,指示进程在哪个终端上运行TIME
:进程使用的 CPU 时间量CMD
:启动该进程的命令在这个例子中,你可以看到:
zsh
shell 进程(你当前的终端会话)ps
命令默认的 ps
命令只显示与你当前终端会话关联的进程。这对于快速检查你最近执行了哪些命令很有用,但它并不能让你全面了解系统中正在发生的情况。
尝试运行另一个命令,然后再次运行 ps
命令,看看输出有什么变化:
echo "Hello, world"
ps
你会注意到 echo
命令没有出现在进程列表中。这是因为它启动并很快结束了,以至于在你执行 ps
命令时它已经不再运行了。
在上一步中,你了解到基本的 ps
命令仅显示与你当前终端相关的进程。然而,一个典型的 Linux 系统会同时运行许多进程,其中大多数与你的终端会话并无直接关联。
若要更全面地了解系统中正在发生的情况,你可以在 ps
命令中使用 -e
选项。
ps -e
PID TTY TIME CMD
1 ? 00:00:00 init.sh
22 ? 00:00:00 supervisord
23 ? 00:00:00 sshd
32 ? 00:00:00 dbus-daemon
35 ? 00:00:00 xfce4-session
···
此输出显示了系统上运行的所有进程,而不仅仅是与你的终端相关的进程。注意,许多进程在 TTY 列中显示为 ?
。这表明这些进程与任何终端都没有关联。
你所看到的许多进程都是在后台运行的系统服务。例如:
init.sh
(PID 1)是系统启动时启动的第一个进程supervisord
是一个进程控制系统sshd
是 SSH 服务器守护进程dbus-daemon
是 D-Bus 消息总线守护进程xfce4-session
是 Xfce 桌面环境的一部分这些进程处理各种系统功能,并提供使你的 Linux 系统能够正常使用的服务。
如果你想知道系统当前正在运行多少个进程,可以将 ps -e
的输出通过管道传递给 wc
命令:
ps -e | wc -l
显示的数字代表系统上正在运行的进程总数,再加上标题的一行。
既然你已经能够查看系统上运行的所有进程,接下来让我们学习如何获取每个进程的更详细信息。ps
命令的 -f
选项可以提供“完整格式”的列表,并包含额外的详细信息。
ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:45 ? 00:00:00 /bin/bash /etc/shiyanlou/sbin/init.sh
root 22 1 0 16:45 ? 00:00:00 /usr/bin/python3 /usr/bin/supervisord -n
root 23 22 0 16:45 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
labex 188 187 0 16:46 pts/0 00:00:00 -zsh
labex 677 188 0 16:55 pts/0 00:00:00 ps -ef
这种格式提供了关于每个进程的更详细信息:
UID
:进程所有者的用户 IDPID
:进程 IDPPID
:父进程 ID(启动此进程的进程)C
:CPU 使用率STIME
:进程的启动时间TTY
:与进程关联的终端TIME
:进程使用的 CPU 时间CMD
:带有参数的完整命令PPID
列对于理解进程之间的关系特别有用。除了第一个进程外,每个进程都是由另一个进程启动的,从而形成了父子关系。
例如,在上面的输出中:
这种层次关系形成了一个“进程树”,你可以使用像 pstree
这样的专业工具来可视化它(本实验未涉及)。
你可以将 ps
与 grep
结合使用来过滤特定的进程。例如,要查找所有与 zsh
shell 相关的进程:
ps -ef | grep zsh
这将显示命令名称中包含“zsh”的所有进程。
尝试在你的系统上搜索其他进程:
ps -ef | grep bash
ps
与过滤工具的这种结合使其成为系统监控和故障排除的强大命令。
既然你已经了解了基本的进程信息和详细列表,接下来让我们探索一些能让 ps
命令更加实用的额外选项。
ps
命令允许你创建包含你感兴趣的特定信息的自定义输出。-o
选项可让你指定要显示的列:
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
此命令将显示:
--sort=-%cpu
参数会按 CPU 使用率对进程进行降序排序(%cpu 前的减号表示降序)。
你应该会看到类似如下的输出:
PID PPID CMD %CPU %MEM
789 788 ps -eo pid,ppid,cmd,%cpu,% 0.0 0.1
188 187 -zsh 0.0 0.1
35 34 xfce4-session 0.0 0.2
32 1 /usr/bin/dbus-daemon --sys 0.0 0.0
23 22 sshd: /usr/sbin/sshd -D [l 0.0 0.1
22 1 /usr/bin/python3 /usr/bin/ 0.0 0.2
1 0 /bin/bash /etc/shiyanlou/s 0.0 0.0
如果你想找出哪些进程占用的内存最多,可以改为按内存使用率排序:
ps -eo pid,user,cmd,%mem --sort=-%mem | head -n 6
此命令将显示占用内存最多的前 5 个进程(加上标题行),并列出它们的 PID、用户、命令和内存使用率百分比。
进程可以处于不同的状态。让我们查看这些信息:
ps -eo pid,stat,cmd
STAT
列使用单字母代码显示进程状态:
R
:正在运行或可运行S
:处于可中断的睡眠等待状态D
:不可中断的睡眠状态(通常是进行 I/O 操作)Z
:僵尸进程T
:已停止或正在被跟踪状态字母后面可能会出现其他字符:
<
:高优先级N
:低优先级s
:会话领导者+
:处于前台进程组这些信息有助于你了解进程在任何给定时刻的运行情况。
虽然 pstree
命令本身不属于 ps
命令,但它可以以可视化的方式展示进程的层次结构:
pstree
它以树状格式显示进程之间的关系,让你更容易理解进程之间的关联。
虽然 ps
命令可以提供特定时刻的进程快照,但有时你需要持续监控进程。在这一步中,我们将探索用于实时进程监控的工具。
top
命令可以动态实时地查看正在运行的系统。它会显示系统摘要信息以及 Linux 内核当前管理的进程或线程列表。
运行以下命令:
top
你会看到类似如下的内容:
top - 17:15:23 up 30 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 31 total, 1 running, 30 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1975.1 total, 1558.7 free, 180.4 used, 236.1 buff/cache
MiB Swap: 975.0 total, 975.0 free, 0.0 used. 1651.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 8988 3208 2556 S 0.0 0.2 0:00.07 init.sh
22 root 20 0 39528 8596 6088 S 0.0 0.4 0:00.20 supervisord
23 root 20 0 12128 6788 5864 S 0.0 0.3 0:00.00 sshd
...
输出分为两部分:
要退出 top
,按 q
键。
系统摘要提供以下信息:
进程列表显示以下信息:
当 top
运行时,你可以使用各种键盘命令与之交互:
M
按内存使用率排序P
按 CPU 使用率排序k
后输入 PID 来终止进程h
获取帮助在运行 top
时尝试按 M
,查看按内存使用率排序的进程。
另一种实时监控的方法是将 watch
命令与 ps
结合使用。这会定期运行一个命令并显示输出,让你可以看到随时间的变化。
watch -n 1 'ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 6'
这会每秒刷新一次,并显示占用 CPU 最多的前 5 个进程。
要退出 watch
,按 Ctrl+C
。
将 ps
与 watch
等实用工具结合使用,能让你具备强大的实时监控系统进程的能力。
在整个实验中,你学习了使用 ps
命令及相关工具在 Linux 系统中监控和管理进程的重要技能。以下是你所学内容的回顾:
基本进程信息:你学会了使用基本的 ps
命令查看与当前终端会话相关的进程,了解了包括 PID、TTY、TIME 和 CMD 在内的基本输出格式。
系统级进程查看:你掌握了使用 ps -e
查看系统上运行的所有进程,而不仅仅是与你的终端相关的进程。
详细进程信息:你探索了 ps -ef
命令,以获取有关进程的详细信息,包括用户 ID、父进程 ID、启动时间和完整的命令行。
高级排序和格式化:你了解了如何使用 ps -eo
和 --sort
参数创建包含特定列和排序选项的自定义输出。
实时监控:你学会了使用 top
命令动态实时查看进程,以及如何将 ps
与 watch
等其他实用工具结合使用进行持续监控。
这些技能是 Linux 环境中系统管理、故障排除和性能监控的基础。了解哪些进程正在运行以及它们如何消耗系统资源,对于维护系统健康和诊断问题至关重要。
当你继续使用 Linux 系统时,有效监控和管理进程的能力将是你最宝贵的技能之一。