显示系统执行的进程
显示系统执行的进程
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 命令选项,这也是我们常用的两种风格
|
|
-
-e
或-A
:ps
命令显示所有进程信息的选项只有 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、TIME
和COMMAND
等数据项,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 3
:ps 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_name4
取ps 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 选项,比如ww
、www
或wwww
。比如 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}')