显示系统执行的进程

警告
本文最后更新于 2023-10-24,文中内容可能已过时。

显示系统执行的进程

ps process status

ps命令用于显示当前进程的状态,类似于静态的 Windows 的任务管理器

常用参数

  • -e:显示所有进程

  • -C:按照命令名筛选

  • -o:自定义输出列  

  • k:对字段排序  

  • f:父子进程形成树状结构

  • h:不显示列名

  • -N:显示所有进程的补集

  • w或则ww或者www:显示超出范围的 command 命令


常用用法

ps -ef

ps aux

然后用文件内容对其进行拆选,比如 | grep

选项

首先,ps 命令有三种选项格式:

  • BSD 风格语法,必须不能以中横线开头;

  • SYSV 风格语法,必须仅一个中横线开头;

  • GNU 风格语法,必须以两个中横线开头;几乎每个 GNU 风格的选项都有一个功能完全相同的 SYSV 风格选项与之对应

各风格的ps命令选项可以混合使用,我们主要介绍 BSD 和 SYSV 两种风格的 ps 命令选项,这也是我们常用的两种风格


1
ps [options] [--help]
  • -e 或 -Aps命令显示所有进程信息的选项只有 2 个,即 SYSV 风格的-e-A。相比之下,-e更容易记忆和书写,请大家牢记这个-e选项。如果想要对进行信息进行筛选,可以通过 grep 命令进行筛

    ps 命令的所有信息都是 linux kernel 生成,并通过/proc/目录输出给用户空间的。在/proc/目录下,每一个以数字开头的目录,就对应一个进程信息。

    几乎可以对应上

  • -C:进程名称选项,C 要大写,显示符合当前进程名称参数的进程。匹配的是cmd或者command列,注意,进程名称不是匹配整个command列,而是仅匹配command中的命令的名称,这里还需要注意,当进程名参数值字符串长度大于 15 时,只是用其前 15 位作为匹配条件。想要对进程名称进行匹配的话,直接 ps aux | grep <pro_name>

  • -p / p / --pid: 进程 ID 选项,查询 PID 值为一个或几个 PID 值范围的进程信息。

    单个 pid

    多个 pid

  • -s / --sid:进程会话 (session)ID 选项

  • -u / U / --User:用户 ID 选项,后面跟用户 id 还是用户名都可以,最好还是跟随用户 id

  • -g / -G:用户组选项,-g后面跟组名,-G后面跟组 id,

  • t / -t:进程终端 (tty) 选项 t 参数表示当前终端的所有进程,-t 后跟终端名,显示指定终端的所有进程,一个sshd进程就是一个会话,一个会话就是一个终端

常用参数也就是 -e -C

以上这些选项不但可以单独使用,还可以组合使用(如下所示)。需要注意的是这些选项之间的组合是逻辑或的关系,不是逻辑与的关系

ps -C tail -t pts/0

tail命令是在终端 pts/1 中执行的,如果这是与的关系,输出结果应该为空

ps -e -u lk会把所有的进程都输出等等,例子很多。

输出字段参数

aux-ef

ps命令的aux选项组合输出USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START、TIMECOMMAND等数据项,ps命令的-ef选项组合输出PID、PPID、TTY、TIME、CMD等数据项。首先一个问题就是,ps命令一共有多少数据项可以输出。这个问题很好回答,通过L选项很容易获取,一共有 168 个数据输出项。ps L命令可以显示这 168 个字段的详细情况:

常用命令的选项情况:

ps -e | head -n 3

ps -el | head -n 3-l 参数的作用的是列出进程的最基本信息(展示多了几列)

C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高


ps -ef | head -n 3:一般用这个 -f 表示使用全格式

  • UID:表示用户 ID

  • PID:表示进程 ID

  • PPID:表示父进程号

  • C:表示 CPU 的占用率

  • STIME:进程的启动时间

  • TTY:登入者的终端机位置

  • TIME:表示进程执行起到现在总的 CPU 占用时间

  • CMD:表示启动这个进程的命令


ps aux | head -n 3ps aux 结合之前的文件处理命令,非常好用

  • USER: 行程拥有者

  • PID: pid 进程 ID

  • %CPU: 占用的 CPU 使用率

  • %MEM: 占用的物理内存的百分比

  • VSZ: 占用的虚拟内存的大小,单位为 KB

  • RSS: 进程占用的物理内存大小,单位为 KB

  • TTY: 终端的次要装置号码 (minor device number of tty)

  • STAT: 该行程的状态:

    • D: 无法中断的休眠状态 (通常 IO 的进程),短暂等待

    • R: 正在执行中

    • S: 静止状态,休眠

    • T: 被跟踪或者被暂停执行

    • Z: 不存在但暂时无法消除,需要手动定期清理

    • W: 没有足够的内存可分配

    • <: 高优先序的行程

    • N: 低优先序的行程

    • L: 有内存分配并锁在内存内

  • START: 进程开始时间

  • TIME: 占用 CPU 的时间

  • COMMAND:所执行的指令,也就是进程名

其他可能遇到的列

  • 字段 tid 表示进程的线程 ID,看出每个线程的 tid 都不相同。

  • 字段 nlwp 表示当前线程组中的线程个数,一把进程都是单线程进程,因此此值为 1。

  • 字段 pid 表示进程 ID,每个进程的 PID 都不相同。

  • 字段 pgid 表示进程组 ID。

  • 字段 sid 表示会话 ID。不同的终端有不同的会话 ID。

  • 字段 tpgid 表示进程连接到的 tty(终端) 所在的前台进程组的 ID。

  • 字段 ppid 表示父进程 ID。

  • stat 列

    • 字符<表示 nice 值小于 0,nice 值最小为 -20。进程特性 nice 值允许进程间接的影响内核调度算法。所谓 nice 就是指对其他进程的谦让程度,显然比 0 越小就越不谦让,比 0 越大就越谦让。顾名思义,越谦让的君子在 CPU 调度过程中占用 CPU 的时间会越少,反之不谦让的进程相比较可能占用更多的 CPU 时间。因此字符’<‘表示此进程可能在调度过程中获得优势。

    • 字符’N’表示 nice 值大于 0,nice 值最大为 19。因此字符’N’表示此进程可能在调度过程中不能获得优势。

    • 字符’L’表示进程 vm_lock 值为真,即此进程有内存页被锁在内存中,这些内存页不能通过换页换出。

    • 字符’s’表示进程的 tgid(pid) 值等于进程的 session(sid) 值,这说明当前进程是会话的 leader。

    • 字符’l’表示进程中的线程数量大于 1,这说明当前进程是一个多线程程序。

    • 字符’+‘表示进程的 pgrp(pgid) 值等于进程的 tpgid 前台进程组 ID,这表示当前进程在前台进程组中。

  • 字段 vsz(virtual memory size)表示进程所申请的虚拟地址空间的内存大小,单位 KB。在 64 位系统中,每个进程都有 128Tb 大小的堆内存虚拟地址空间的内存空间大小。vsz 值并不反映进程占用的真正物理内存大小。

  • 字段 rss(resident set size)表示进程真正占用了的物理内存大小,单位 KB。

  • 字段 pmem 表示进程占用的物理内存大小 (即 rss) 占本机总物理内存大小百分比。

  • 字段 trs(text resident set size)表示用于可执行代码的物理内存大小,约等于进程的程序尺寸大小。

  • 字段 drs(data resident set size)表示可执行代码之外的内存大小,实际基本等于 vsz 减去 trs 的值。

  • 字段 size 表示如果进程交换到磁盘所需的交换空间大小。

  • 字段 sz 表示进程在物理页面中的核心镜像的大小。

  • 字段 minflt 表示此进程中发生的次缺页异常的数量。

  • 字段 majflt 表示此进程中发生的主缺页异常的数量。

我们也可以自定义输出字段

ps -o colum_name0, colum_name1, colum_name2, colum_name3, colum_name4….  

colum_name4ps L的第一列

例如:

ps -C java -o pid,ppid

ps -C java -o pid,%cpu

排序参数

  • k:选项 k 可以让我们以某个字段为条件对输出结果进行排序,并且还可以使用+-符号设置升序排序还是降序排序,选项 k 还可以使用多个字段同时对结果集排序,多个字段用,隔开,排在前面的字段如果相同就按排在后面字段继续排序。

    ps aux  k -%cpu,+vsz | head

  • --sort:例如ps aux --sort=-%mem

树形结构参数

  • f 或者 -H:每一个进程都有一个父进程,所有用户空间的进程的最终父进程都是 pid 为 1 的进程 systemd,所有内核空间的线程的最终父线程都是 pid 为 2 的线程 [kthreadd](kernal thread 内核进程)。这样所有进程按照父子进程的关系就可以构成 2 个树形结构。

    选项 f 是使用 ACSII 码对父子进程进行关联,选项-H 是使用 tab 空格对父子进程进行关联,f 选项更直观,一般用 f 选项

    ps -e f

    ……….

    ……….

    眼熟!!!

    本来以为启动 tomcat 之后,用ps -e f会看到层级结构,结果没有

    ps -C sshd f  

    先匹配所有sshd运行的进程,然后把他们按照父子进程连起来。

特殊参数

  • h:当不希望结果中出现标题页头这一行信息时,h 选项可以隐藏 ps 输出结果中的标题栏,这在把 ps 的结果传给下一个命令进行处理的时候很有用

    ps -u lk h

  • -N:取前面的结果在所有进程(ps -e的结果)中的补集

  • -w 或者 w:一般情况下,command 列的数据也就是进程命令很长,默认情况下,会将命令超出屏幕的部分截取掉,这样势必会影响系统管理员调查问题,使用w-w选项,就会将完整的进程命令信息显示,多出的部分换行显示。有的时候为了效果好一点,建议我们可以多使用几次 w 选项,比如wwwwwwwww

    比如 Java 运行 tomcat 的进程

    ps aux

    ps aux www

应用实例

一般都是结合管道进行二次筛选

ps -ef | grep xxx

例如:

tomcat 所在进程搜索:

ps -ef | grep tomcat

ps -C java -o pid,command

ps aux | grep tomcat

获取 dmserver 的进程,然后kill

kil $(ps -elf |grep dmserver | head -n 1 | awk '{print $4}')

0%