# top命令 `top`命令提供运行系统的动态实时视图,其可以显示系统摘要信息,以及当前由内核管理的进程或线程的列表,显示的系统摘要信息的类型以及为任务显示的信息的类型、顺序和大小都是用户可配置的。 ## 语法 ```shell top -hv | -bcHisS -d delay -n limit -u|U user | -p pid -w [cols] ``` ## 参数 * `-h`: 输出帮助信息。 * `-v`: 输出版本信息。 * `-b`: 以批处理模式启动`top`,这对于从`top`向其他程序或文件发送输出很有用,在这种模式下,`top`将不接受输入并运行,直到您使用'`-n`'命令行选项设置了迭代次数限制或终止为止。 * `-c`: 以倒转最后一个记忆中的`c`状态开始,因此如果`top`显示命令行,那么现在该字段将显示程序名,反之亦然。 * `-d interval`: 指定屏幕更新之间的延迟,并覆盖个人配置文件中的相应值或启动默认值,启动后也可以使用`d`或`s`交互命令更改。 * `-H`: 指示`top`显示各个线程,如果没有此命令行选项,则显示每个进程中所有线程的总和,启动后可以使用`H`交互命令更改。 * `-i`: 空闲进程切换,以倒转最后一个记忆中的`i`状态开始,关闭此切换时,将不显示自上次更新以来未使用任何`CPU`的任务。 * `-n limit`: 指定`top`在结束前应产生的最大迭代次数或帧数。 * `-o`: 指定将对任务进行排序的字段的名称,与配置文件中反映的内容无关,您可以在字段名前面加上`+`或`-`,以覆盖排序方向,前导`+`将强制从高到低排序,而`-`将确保从低到高排序,此选项主要用于支持自动脚本化批处理模式操作。 * `-O`: 此选项作为上述`-o`选项的帮助形式,它将使`top`在单独的一行中打印每个可用的字段名,然后退出。 * `-p pid`: 仅监视具有指定进程`ID`的进程,此选项最多可以给予`20`次,也可以提供一个逗号分隔的列表,其中最多包含`20`个`PID`,允许两种方法混合使用,`pid`值为零将被视为`top`程序运行时的进程`id`,这只是一个命令行选项,如果您希望返回正常操作,则无需退出并重新启动`top`,只需发出以下任何交互式命令`=`、`u`或`U`,对于`p`、`u`和`U`命令行选项是互斥的。 * `-s`: 安全模式操作,以强制的安全模式启动`top`,即使对于`root`也是如此,通过系统配置文件可以更好地控制此模式。 * `-S`: 累计时间切换,以倒转最后一个记忆中的`S`状态开始,当累计时间模式打开时,每个进程都会列出它及其子进程使用的`cpu`时间。 * `-u user-id-or-name, -U user-id-or-name`: 仅显示用户`id`或用户名与给定进程匹配的进程,`-u`选项匹配有效用户,而`-U`选项匹配任何用户`real`、`effective`、`saved`或`filesystem`,在感叹号`!`前面加上前缀用户`id`或名称指示`top`仅显示用户与提供的进程不匹配的进程,`p`、`u`和`U`命令行选项是互斥的。 * `-w number`: 在批处理模式下,如果没有参数,`top`将使用`COLUMNS=`和`LINES=`环境变量(如果设置)格式化输出,否则,宽度将固定在最大`512`列,通过一个参数,可以减少或增加输出宽度(最多`512`行),但行数被认为是无限的,在正常显示模式下,如果没有参数,`top`将尝试使用`COLUMNS=`和`LINES=`环境变量(如果设置)格式化输出,对于参数,输出宽度只能减小,不能增大,无论是使用环境变量还是带有`-w`的参数,当不处于批处理模式时,都不能超过实际的终端维度,注意如果不使用此命令行选项,输出宽度始终基于调用`top`的终端,无论是否处于批处理模式。 ## 操作 以下启动默认值操作假定没有相关配置文件,即没有用户自定义,此外带星号`*`的项目可以通过命令行覆盖。 * `^Z`: 挂起。 * `fg`: 恢复挂起的命令。 * ``: 强制屏幕重绘。 * `A`: 交叉显示,默认全屏显示。 * `d`: `*`延迟时间,默认为`3s`。 * `H`: `*`线程模式,默认关闭。 * `I`: `Irix`模式,默认开启。 * `p`: `*`监控`PID`,默认显示所有进程。 * `1`: 查看服务器的`cpu`逻辑数。 * `M`: 根据驻留内存大小进行排序。 * `P`: 根据`CPU`使用百分比大小进行排序。 * `T`: 根据时间`/`累计时间进行排序。 * `c`: 切换显示命令名称和完整命令行。 * `t`: 切换显示进程和`CPU`信息。 * `m`: 切换显示内存信息。 * `l`: 切换显示平均负载和启动时间信息 。 * `o`: 改变显示项目的顺序。 * `f`: 从当前显示中添加或删除列项目。 * `S`: 切换到累计模式。 * `s`: 改变两次刷新之间的延迟时间,系统将提示用户输入新的时间,单位为`s`,如果有小数,就换算成`ms`。 * `q`: 退出`top`命令。 * `i`: 忽略闲置和僵尸进程。 * `k`: 终止一个进程。 ## 相关信息 ### 概览 * `total`: 进程总数。 * `running`: 正在运行的进程数。 * `sleeping`: 睡眠的进程数。 * `stopped`: 停止的进程数。 * `zombie`: 僵尸进程数。 ### CPU信息 * `us`: 用户空间占用`CPU`百分比。 * `sy`: 内核空间占用`CPU`百分比。 * `ni`: 用户进程空间内改变过优先级的进程占用`CPU`百分比。 * `id`: 空闲`CPU`百分比。 * `wa`: 等待输入输出的`CPU`时间百分比。 * `hi`: 硬件`CPU`中断占用百分比。 * `si`: 软中断占用百分比。 * `st:`虚拟机占用百分比。 ### 列字段 可以使用`f`交互命令自定义列的位置及其是否可显示。 * `%CPU`: `CPU Usage`,`CPU`使用率,任务自上次屏幕更新以来占用的`CPU`时间份额,表示为总`CPU`时间的百分比,在真正的`SMP`环境中,如果一个进程是多线程的,并且`top`不是以线程模式运行的,那么可能会报告大于`100%`的数量,您可以使用`H`交互命令切换线程模式,同样对于多处理器环境,如果`Irixmode`处于关闭状态,`top`将在`Solarismode`下运行,其中任务的`cpu`使用量将除以`cpu`总数,您可以使用`I`交互命令切换`Irix/Solaris`模式。 * `%MEM`: `Memory Usage (RES)`,内存使用情况,任务当前使用的可用物理内存共享。 * `CGROUPS`: `Control Groups`,控制组,流程所属的控制组的名称,如果不适用于该流程,则为`-`,控制组用于在安装定义的进程组之间分配资源(`cpu`、内存、网络带宽等),它们支持对这些资源的分配、拒绝、优先排序、管理和监视进行细粒度控制,一个系统上可以同时存在许多不同的`cgroup`层次结构,并且每个层次结构都连接到一个或多个子系统,子系统表示单个资源,注意`: CGROUPS`字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多`512`个字符),即便如此,这种可变宽度的字段仍然会受到截断。 * `CODE`: `Code Size (KiB)`,代码大小`KiB`,用于可执行代码的物理内存量,也称为文本驻留集大小或`TRS`。 * `COMMAND`: `Command Name or Command Line`,命令名或命令行,显示用于启动任务的命令行或关联程序的名称,您可以使用`c`在命令行和名称之间切换,这既是一个命令行选项,也是一个交互式命令,当您选择显示命令行时,没有命令行的进程(如内核线程)将只显示程序名,此字段也可能受视图显示模式的影响,注意`COMMAND`字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多`512`个字符),即便如此,这种可变宽度的字段仍然会受到截断,当显示命令行时,此字段尤其如此。 * `DATA`: `Data + Stack Size (KiB)`,用于可执行代码以外的物理内存量,也称为数据驻留集大小或`DRS`。 * `ENVIRON`: `Environment variables`,显示各个进程看到的所有环境变量(如果有),这些变量将以原始的本机顺序显示,而不是您习惯于用非限定的`set`看到的排序顺序,注意`ENVIRON`字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多`512`个字符),即便如此,这种可变宽度的字段仍然会受到截断。 * `Flags`: `Task Flags`,此列表示任务的当前调度标志,这些标志以十六进制表示,并且不包含零,这些标志正式记录在``中。 * `GID`: `Group Id`,有效组`ID`。 * `GROUP`: `Group Name`,有效组名。 * `NI`: `Nice Value`,负的`nice`值意味着更高的优先级,而正的`nice`值意味着更低的优先级,此字段中的零表示在确定任务的调度能力时不会调整优先级。 * `P`: `Last used CPU (SMP)`,表示最后使用的处理器的数字,在真正的`SMP`环境中,这可能会频繁更改,因为内核有意使用弱关联,另外,运行`top`的行为可能会破坏这种弱关联,并导致更多进程更频繁地更改`cpu`(因为对`cpu`时间的额外需求)。 * `PGRP`: `Process Group Id`,每个进程都是唯一进程组的成员,该进程组用于分配信号,并由终端对其输入和输出请求进行仲裁,创建(`fork`)流程时,它将成为其父流程组的成员,按照约定,该值等于流程组的第一个成员(称为流程组长)的流程`ID`。 * `PID`: `Process Id`,任务的唯一进程`ID`,它定期包装,但从不在零重新启动,在内核中,它是一个由`task_struct`定义的可调度实体,此值还可用作`: `进程组`ID`、会话负责人的会话`ID`、线程组负责人的线程组`ID`、进程组负责人的`TTY`进程组`ID`。 * `PPID`: `Parent Process Id`,任务父进程的进程`ID`(`pid`)。 * `PR`: `Priority`,任务的调度优先级,如果在该字段中看到`rt`,则表示任务正在实时调度优先级下运行,在`linux`下,实时优先级有些误导,因为传统上操作本身是不可抢占的,虽然`2.6`内核可以被大部分抢占,但并不总是这样。 * `RES`: `Resident Memory Size (KiB)`,任务使用的非交换物理内存。 * `RUID`: `Real User Id`,真实用户`ID`。 * `RUSER`: `Real User Name`,真实的用户名。 * `S`: `Process Status`,任务的状态,可以是: `D`不间断睡眠、`R`运行、`S`睡眠、`T`跟踪或停止、`Z`僵尸,显示为正在运行的任务应该更恰当地被认为是准备运行的——它们的任务结构只在`Linux`运行队列中表示,即使没有真正的`SMP`机器,根据`top`的延迟间隔和`nice`值,也可能会看到许多处于这种状态的任务。 * `SHR`: `Shared Memory Size (KiB)`,一个任务可用的共享内存量,通常不是所有的内存都是驻留的,它只是反映了可能与其他进程共享的内存。 * `SID`: `Session Id`,会话是进程组的集合,通常由登录`shell`建立,新`fork`的进程加入其创建者的会话,按照惯例,这个值等于会话的第一个成员的进程`ID`,称为会话头,通常是登录`shell`。 * `SUID`: `Saved User Id`,保存的用户`ID`。 * `SUPGIDS`: `Supplementary Group IDs`,建立的或从任务父级继承的任何补充组的`ID`,它们以逗号分隔的列表显示,注意`SUPGIDS`字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多`512`个字符),即便如此,这种可变宽度的字段仍然会受到截断。 * `SUPGRPS`: `Supplementary Group Names`,登录时建立的或从任务父级继承的任何补充组的名称,它们以逗号分隔的列表显示,注意`: SUPGRPS`字段与大多数列不同,不是固定宽度的,显示时,它加上任何其他可变宽度列将分配所有剩余屏幕宽度(最多`512`个字符),即便如此,这种可变宽度的字段仍然会受到截断。 * `SUSER`: `Saved User Name`,保存的用户名。 * `SWAP`: `Swapped Size (KiB)`,任务地址空间的非驻留部分。 * `TGID`: `Thread Group Id`,任务所属的线程组的`ID`,它是线程组负责人的`PID`,在内核术语中,它表示那些共享`mm_struct`的任务。 * `TIME`: `CPU Time`,任务自启动以来使用的总`CPU`时间,当累积模式打开时,每个进程都会列出它及其子进程使用的`cpu`时间,使用`S`切换累积模式,这既是命令行选项,也是交互式命令,有关此模式的其他信息,请参阅`S`交互命令。 * `TIME+`: `CPU Time, hundredths`,与`Time`相同,但通过百分之一秒反映出更多的粒度。 * `TPGID`: `Tty Process Group Id`,连接的`tty`的前台进程的进程组`ID`,如果进程未连接到终端,则为`-1`,按照惯例,此值等于流程组长的流程`ID`。 * `TTY`: `Controlling Tty`,控制终端的名称,这通常是启动进程的设备(串口、`pty`等),并用于输入或输出,但是,任务不需要与终端相关联,在这种情况下,您将看到`?`显示。 * `UID`: `User Id`,任务所有者的有效用户`ID`。 * `USED`: `Memory in Use (KiB)`,此字段表示任务已使用的非交换物理内存(`RES`)加上其地址空间(`SWAP`)的非驻留部分。 * `USER`: `User Name`,任务所有者的有效用户名。 * `VIRT`: `Virtual Memory Size (KiB)`,任务使用的虚拟内存总量。它包括所有代码、数据和共享库,以及已调出的页面和已映射但未使用的页面。 * `WCHAN`: `Sleeping in Function`,取决于内核链接映射的可用性系统地图),此字段将显示任务当前休眠的内核函数的名称或地址,正在运行的任务将在此列中显示一个破折号`-`,通过显示此字段,`top`自己的工作集可以增加`700Kb`以上,具体取决于内核版本,如果发生这种情况,减少开销的唯一方法就是停止并重新启动`top`。 * `nDRT`: `Dirty Pages Count`,自上次写入辅助存储器以来已修改的页数,`dirty pages`必须先写入辅助存储器,然后才能将相应的物理内存位置用于其他虚拟页。 * `nMaj`: `Major Page Fault Count`,任务发生的主要页错误数,当进程试图读取或写入其地址空间中当前不存在的虚拟页时,会发生页错误,一个主要的页面错误是当辅助存储访问涉及到使该页面可用时。 * `nMin`: `Minor Page Fault count`,任务发生的次要页面错误数,当进程试图读取或写入其地址空间中当前不存在的虚拟页时,会发生页错误,在使该页可用时,较小的页错误不涉及辅助存储器访问。 * `nTH`: `Number of Threads`,与进程关联的线程数。 * `nsIPC`: `IPC namespace`,用于隔离进程间通信(`IPC`)资源(如`SystemVIPC`对象和`POSIX`消息队列)的命名空间的`Inode`。 * `nsMNT`: `MNT namespace`,命名空间的`Inode`,用于隔离文件系统装入点,从而提供文件系统层次结构的不同视图。 * `nsNET`: `NET namespace`,命名空间的`Inode`,用于隔离网络设备、`IP`地址、`IP`路由、端口号等资源。 * `nsPID`: `PID namespace`,命名空间的`Inode`,用于隔离进程`ID`号,这意味着它们不必保持唯一,因此,每个这样的名称空间都可以有自己的`init`(`PID#1`)来管理各种初始化任务并获取孤立的子进程。 * `nsUSER`: `USER namespace`,用于隔离用户和组`ID`号的命名空间的`Inode`,因此,一个进程可以在用户名称空间外有一个普通的未授权用户`ID`,而在该名称空间内有一个具有完全根权限的用户`ID0`。 * `nsUTS`: `UTS namespace`,用于隔离主机名和`NIS`域名的命名空间的`Inode, UTS`的意思是`UNIX`分时系统。 * `vMj`: `Major Page Fault Count Delta`,自上次更新以来发生的主要页错误数。 * `vMn`: `Minor Page Fault Count Delta`,自上次更新以来发生的次要页面错误的数量。 ## 示例 显示进程信息。 ```shell top ``` 显示完整命令。 ```shell top -c ``` 以批处理模式显示程序信息。 ```shell top -b ``` 以累积模式显示程序信息。 ```shell top -S ``` 设置信息更新次数,表示更新两次后终止更新显示。 ```shell top -n 2 ``` 设置信息更新时间,表示更新周期为`3`秒。 ```shell top -d 3 ``` 显示指定的进程信息,`CPU`、内存占用率等。 ```shell top -p 131 ``` 不能利用交互式指令来对进程下命令。 ```shell top -s ``` ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 参考 ``` https://www.computerhope.com/unix/top.htm https://www.commandlinux.com/man-page/man1/top.1.html https://www.geeksforgeeks.org/top-command-in-linux-with-examples/ ```