Linux 进程显示

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

进程管理是 Linux 系统管理的一个基本方面。你在 Linux 中运行的每个程序或命令都会创建一个进程,监控这些进程对于维护系统性能和解决问题至关重要。

本实验将指导你掌握 ps 命令,这是一个用于监控和管理 Linux 系统上运行的进程的强大工具。通过了解如何使用 ps 命令及其各种选项,你将能够随时深入了解系统中正在发生的情况。

在整个实验过程中,你将学习如何以不同格式显示进程、查看所有系统进程,以及理解 ps 可以提供的关于每个进程的详细信息。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/wc("Text Counting") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/SystemInformationandMonitoringGroup -.-> linux/watch("Command Repeating") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") linux/SystemInformationandMonitoringGroup -.-> linux/top("Task Displaying") subgraph Lab Skills linux/echo -.-> lab-271363{{"Linux 进程显示"}} linux/wc -.-> lab-271363{{"Linux 进程显示"}} linux/grep -.-> lab-271363{{"Linux 进程显示"}} linux/watch -.-> lab-271363{{"Linux 进程显示"}} linux/ps -.-> lab-271363{{"Linux 进程显示"}} linux/top -.-> lab-271363{{"Linux 进程显示"}} end

理解基本进程信息

在 Linux 中,每个正在运行的程序或命令都由一个进程表示。每个进程都有一个唯一的标识符,称为进程 ID(Process ID,PID)。ps 命令允许你查看这些进程并获取有关它们的信息。

让我们从探索 ps 命令的基本用法开始。

基本的 ps 命令

  1. 在 LabEx 环境中打开你的终端。你应该从 ~/project 目录开始。

  2. 输入以下命令并按回车键:

ps
  1. 你将看到类似如下的输出:
  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 查看所有进程

  1. 在你的终端中,输入以下命令并按下回车键:
ps -e
  1. 你将看到一个长得多的进程列表,类似于:
  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 获取详细信息

  1. 在你的终端中,输入以下命令并按下回车键:
ps -ef
  1. 你将看到类似如下的输出:
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:进程所有者的用户 ID
  • PID:进程 ID
  • PPID:父进程 ID(启动此进程的进程)
  • C:CPU 使用率
  • STIME:进程的启动时间
  • TTY:与进程关联的终端
  • TIME:进程使用的 CPU 时间
  • CMD:带有参数的完整命令

理解进程关系

PPID 列对于理解进程之间的关系特别有用。除了第一个进程外,每个进程都是由另一个进程启动的,从而形成了父子关系。

例如,在上面的输出中:

  • PID 为 1 的进程(init.sh)的 PPID 为 0(它是第一个进程)
  • PID 为 22 的进程(supervisord)的 PPID 为 1(它由 init.sh 启动)
  • PID 为 23 的进程(sshd)的 PPID 为 22(它由 supervisord 启动)

这种层次关系形成了一个“进程树”,你可以使用像 pstree 这样的专业工具来可视化它(本实验未涉及)。

过滤进程信息

你可以将 psgrep 结合使用来过滤特定的进程。例如,要查找所有与 zsh shell 相关的进程:

ps -ef | grep zsh

这将显示命令名称中包含“zsh”的所有进程。

尝试在你的系统上搜索其他进程:

ps -ef | grep bash

ps 与过滤工具的这种结合使其成为系统监控和故障排除的强大命令。

进程信息排序和高级选项

既然你已经了解了基本的进程信息和详细列表,接下来让我们探索一些能让 ps 命令更加实用的额外选项。

使用 ps 自定义格式

ps 命令允许你创建包含你感兴趣的特定信息的自定义输出。-o 选项可让你指定要显示的列:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

此命令将显示:

  • 进程 ID(pid)
  • 父进程 ID(ppid)
  • 命令(cmd)
  • CPU 使用率百分比(%cpu)
  • 内存使用率百分比(%mem)

--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 进行层次化查看

虽然 pstree 命令本身不属于 ps 命令,但它可以以可视化的方式展示进程的层次结构:

pstree

它以树状格式显示进程之间的关系,让你更容易理解进程之间的关联。

实时进程监控

虽然 ps 命令可以提供特定时刻的进程快照,但有时你需要持续监控进程。在这一步中,我们将探索用于实时进程监控的工具。

使用 top 命令

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
   ...

输出分为两部分:

  1. 系统摘要(前 5 行)
  2. 进程列表(默认按 CPU 使用率排序)

要退出 top,按 q 键。

理解 top 输出

系统摘要提供以下信息:

  • 系统运行时间和负载平均值
  • 按状态(运行、睡眠、停止、僵尸)统计的任务数量
  • CPU 使用率细分
  • 内存和交换空间使用情况

进程列表显示以下信息:

  • PID:进程 ID
  • USER:用户所有者
  • PR:优先级
  • NI:谦让值(nice 值)
  • VIRT:使用的虚拟内存
  • RES:使用的常驻内存
  • SHR:共享内存
  • S:进程状态
  • %CPU:CPU 使用率
  • %MEM:内存使用率
  • TIME+:使用的 CPU 时间
  • COMMAND:命令名称

top 中的交互式命令

top 运行时,你可以使用各种键盘命令与之交互:

  • M 按内存使用率排序
  • P 按 CPU 使用率排序
  • k 后输入 PID 来终止进程
  • h 获取帮助

在运行 top 时尝试按 M,查看按内存使用率排序的进程。

将 watch 命令与 ps 结合使用

另一种实时监控的方法是将 watch 命令与 ps 结合使用。这会定期运行一个命令并显示输出,让你可以看到随时间的变化。

watch -n 1 'ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 6'

这会每秒刷新一次,并显示占用 CPU 最多的前 5 个进程。

要退出 watch,按 Ctrl+C

pswatch 等实用工具结合使用,能让你具备强大的实时监控系统进程的能力。

总结

在整个实验中,你学习了使用 ps 命令及相关工具在 Linux 系统中监控和管理进程的重要技能。以下是你所学内容的回顾:

  1. 基本进程信息:你学会了使用基本的 ps 命令查看与当前终端会话相关的进程,了解了包括 PID、TTY、TIME 和 CMD 在内的基本输出格式。

  2. 系统级进程查看:你掌握了使用 ps -e 查看系统上运行的所有进程,而不仅仅是与你的终端相关的进程。

  3. 详细进程信息:你探索了 ps -ef 命令,以获取有关进程的详细信息,包括用户 ID、父进程 ID、启动时间和完整的命令行。

  4. 高级排序和格式化:你了解了如何使用 ps -eo--sort 参数创建包含特定列和排序选项的自定义输出。

  5. 实时监控:你学会了使用 top 命令动态实时查看进程,以及如何将 pswatch 等其他实用工具结合使用进行持续监控。

这些技能是 Linux 环境中系统管理、故障排除和性能监控的基础。了解哪些进程正在运行以及它们如何消耗系统资源,对于维护系统健康和诊断问题至关重要。

当你继续使用 Linux 系统时,有效监控和管理进程的能力将是你最宝贵的技能之一。