如何使用 ps 命令监控 Linux 进程

Linux进程监控与管理:使用ps命令

在Linux系统中,ps 命令是一个强大的工具,可以帮助你获取系统中正在运行的进程快照。通过灵活运用 ps 命令,你可以根据进程名称、用户、甚至终端来定位进程,并且能够获取到不同详细程度的进程信息。本文将详细介绍 ps 命令的使用方法。

Linux中的进程管理

Linux以及类Unix操作系统的核心是内核,内核的主要职责之一是管理和分配系统资源,例如内存(RAM)和处理器时间(CPU)。内核会实时处理这些资源分配,确保每个正在运行的进程都能根据其优先级获得公平的资源份额。

有时,某些任务可能会因为各种原因而陷入僵局、无限循环或无响应状态。或者,它们可能持续运行,但会过度占用CPU或内存,导致系统性能下降。这时,可能需要终止这些任务。而第一步,当然是识别出这些问题进程。此外,你可能只是好奇计算机内部正在运行哪些进程,想一探究竟。 ps 命令可以满足这两种需求。它为你提供一份系统当前正在运行的进程的即时快照。

ps 命令非常灵活,可以按照你想要的格式准确提供你需要的信息。实际上,ps 命令有很多选项。这里介绍的选项可以满足大多数常见需求。如果需要更深入地了解 ps 命令,本文的介绍可以帮助你更容易理解其手册页。

列出进程

使用 ps 命令最简单的方式是不带任何参数直接运行:

ps

此时,ps 命令会列出由当前用户启动的进程。

输出结果包含以下几列:

PID 进程的ID号。
TTY 用户登录的控制台名称。
TIME 进程已使用的CPU处理时间。
CMD 启动进程的命令名称。

列出所有用户的进程

通过添加 -e 选项(表示选择所有进程),我们可以让 ps 命令列出所有用户的进程,而不仅仅是运行 ps 命令的用户。由于这将产生一个很长的列表,我们通常会将其输出通过管道传递给 less 命令进行分页查看:

ps -e | less

这样,进程列表会通过管道传递给 less 命令进行显示。

现在列表中有更多的条目,但是显示的四列信息与之前相同。 TTY 列中带有问号 ? 的条目表示这些进程不是从终端窗口启动的。

显示进程层级结构

有时,查看哪些进程启动了其他进程可以帮助我们找出问题或识别特定进程。 我们可以使用 -H 选项(表示层级结构)来实现此目的:

ps -eH | less

缩进表示哪些进程是其他进程的父进程。

为了更清晰地查看层级结构,我们可以使用 --forest 选项,让 ps 命令添加一些 ASCII 线,将层级结构绘制成树状图:

ps -eH --forest | less

这样可以更容易地跟踪哪些进程是其他进程的父进程。

按名称列出进程

你可以将 ps 命令的输出通过管道传递给 grep 命令,来查找 具有与搜索词匹配的名称 的进程。 例如,我们在这里查找与 “firefox” 搜索词匹配的条目:

ps -e | grep firefox

在这种情况下,输出结果是与 “firefox” 进程匹配的单个条目。当然,如果启动了多个 Firefox 实例,列表中会返回多个项目。

显示更多列

要向输出添加更多列,可以使用 -f 选项(表示全格式):

ps -ef | less

现在,ps 命令的输出中会包含一组额外的列。

这些额外的列包括:

UID 此进程所有者的用户ID。
PID 进程的进程ID。
PPID 进程的父进程ID。
C 进程拥有的子进程数量。
STIME 进程开始时间。
TTY 用户登录的控制台名称。
TIME 进程已使用的CPU处理时间。
CMD 启动进程的命令名称。

通过使用 -F 选项(表示额外全格式),可以获得更多的列:

ps -eF | less

这次我们获得的列需要横向滚动屏幕才能完全显示。

按下“右箭头”键,可以向右移动查看更多列。

现在输出包含的列有:

UID 此进程所有者的用户ID。
PID 进程的进程ID。
PPID 进程的父进程ID。
C 进程拥有的子进程数量。
SZ 进程映像的RAM页大小。
RSS 常驻集大小。这是进程使用的非交换物理内存。
PSR 进程被分配到的处理器。
STIME 进程开始时间。
TTY 用户登录的控制台名称。
TIME 进程已使用的CPU处理时间。
CMD 启动进程的命令名称。

按进程ID列出进程

在找到你感兴趣的进程ID后,你可以使用 ps 命令来列出该进程的详细信息。使用 -p 选项(表示按进程ID选择)来实现:

ps -p 3403

这将列出指定进程的详细信息。

你不仅限于一个进程ID,可以提供以空格分隔的进程ID列表。

按命令列出进程

-C 选项(表示命令)允许你使用命令名称搜索进程。这指的是启动进程的命令名称,而不是完整的命令行,命令行可能包括路径名和参数或选项:

ps -C shutter

这会列出名为 shutter 的进程的详细信息。

列出用户拥有的进程

要查看特定用户拥有的进程,请使用 -u 选项(表示用户列表):

ps -u mary

这会显示用户账户 mary 拥有的所有进程。

按终端列出进程

要查看与特定终端 (TTY) 关联的进程,请使用 -t 选项(表示按TTY选择)。如果在没有TTY号码的情况下使用,则 -t 选项报告与当前终端窗口关联的进程。首先,我们可以使用 tty 命令来查看当前终端:

tty
ps -t

tty 命令报告当前终端是伪电传 0 (pts/0)。 ps -t 列出的进程都与 TTY pts/0 相关联。

如果我们在命令行中传递一个 TTY 号码,我们应该会得到与该 TTY 关联的进程报告:

ps -t 1

这次,进程都与 TTY pts/1 相关联。

选择要显示的列

使用 -o 选项(表示格式),你可以选择要包含在 ps 输出中的列。你可以按名称指定列。列名称的完整列表可以在 手册页 中标题为“标准格式说明符”的部分找到。在这个例子中,我们选择在输出中包含 CPU 时间 (pcpu) 和带有参数 (args) 的命令行:

ps -e -o pcpu,args | less

输出只包含我们请求的两个列。

按列对输出进行排序

你可以使用 --sort 选项对输出进行排序。让我们按 CPU 列对输出进行排序:

ps -e -o pcpu,args --sort -pcpu| less

pcpu 排序参数上的连字符 - 表示降序排序。

要查看 CPU 占用率最高的 10 个进程,可以通过管道将输出传递给 head 命令:

ps -e -o pcpu,args --sort -pcpu | head -10

现在我们得到了一个排序且截断的列表。

如果我们在显示中添加更多列,我们可以按更多列进行排序。让我们添加 pmem 列,它表示进程正在使用的计算机内存的百分比。如果没有连字符 (-) 或加号 (+),排序顺序将为升序:

ps -e -o pcpu,pmem,args --sort -pcpu,pmem | head -10

现在我们有了额外的列,并且排序中考虑了新添加的列。 第一列按降序排序,第二列按升序排序,因为我们在 pmem 上没有添加连字符。

为了使输出更有用,我们可以添加进程 ID 列 (pid),以便在列表中看到每个进程的进程号:

ps -e -o pid,pcpu,pmem,args --sort -pcpu,pmem | head -10

现在我们可以更好地识别进程。

按进程ID杀死进程

我们已经介绍了一系列识别进程的方法,包括名称、命令、用户和终端。我们还介绍了通过动态属性,例如 CPU 使用率和内存来识别进程的方法。通过这些方法,我们可以识别正在运行的进程,并通过它们的进程 ID,我们可以使用 kill 命令来终止任何这些进程(如果需要)。例如,要终止进程 898,我们可以使用以下格式:

sudo kill 898

如果一切顺利,该进程将被静默终止。

按名称杀死进程

pkill 命令允许你 按名称杀死进程。请确保你已经确定了正确的进程!该命令将终止顶层进程。

sudo pkill top

同样,没有输出就是好消息。该进程已被静默终止。

按名称杀死多个进程

如果你有一个进程的多个副本在运行,或者一个进程产生了许多子进程(就像谷歌浏览器一样),你可以使用 killall 命令来杀死它们。例如,假设我们有两个 top 命令的副本在运行:

ps -e | grep top

我们可以使用以下命令 终止所有这些进程

sudo killall top

没有响应意味着没有问题,因此这两个进程都已终止。

使用top获取动态视图

ps 命令的输出是进程的静态快照,它不会更新。要获取进程的动态视图,可以使用 top 命令。它提供了 计算机中运行的进程的实时视图。显示器分为两个部分。屏幕顶部有一个由文本行组成的仪表板区域,屏幕下部有一个由列组成的表格。

使用以下命令启动 top:

top

这些列包含有关进程的信息:

PID 进程 ID
USER 进程所有者的名称
PR 进程优先级
NI 进程的nice值
VIRT 进程使用的虚拟内存
RES 进程使用的常驻内存
SHR 进程使用的共享内存
S 进程的状态。请参阅下面该字段可以采用的值的列表
%CPU 自上次更新以来进程使用的 CPU 时间份额
%MEM 使用的物理内存份额
TIME+ 任务使用的总 CPU 时间,以百分之一秒为单位
COMMAND 命令名称或命令行(名称和命令行参数)。如果看不到命令列,请按“右箭头”键。

进程的状态可以是以下之一:

  • D:不间断睡眠
  • R:运行
  • S:睡眠
  • T:跟踪 (停止)
  • Z:僵尸

按下 Q 键从 top 命令退出。

在杀死进程之前

在终止一个进程之前,请确保它是你想要终止的进程,并检查它是否会引发问题。特别需要注意的是,使用 -H 选项(层级结构)和 --forest 选项,以确保它没有任何你可能忽略的重要子进程。