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
选项,以确保它没有任何你可能忽略的重要子进程。