ps是linux中用于显示进程的工具,确切来说是显示活动进程的工具
ps的基本格式是 ps [选项]
sh-3.2# ps --help
ps: illegal option -- -
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]][-g grp[,grp...]] [-u [uid,uid...]][-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]ps [-L]
flag一览
-A: 显示所有进程。-a: 显示除控制进程和无终端进程外的所有进程。-C: 通过命令名而非进程号来选择进程。-c: 显示进程的真实命令名,而不是更常见的命令行。-E: 设置或显示环境变量。-e: 显示环境变量。-f: 显示全格式,包括命令行。-h: 不显示标题。-j: 作业格式。-l: 长格式。比标准格式显示更多的信息。-M: 显示线程信息。-m: 按内存使用大小排序。-r: 只显示正在运行的进程。-S: 包括已完成的进程的子进程的CPU时间。-T: 显示线程信息。-v: 显示虚拟内存使用情况。-w: 使用宽输出格式。-X: 旧的Linux i386 注册表格式。-x: 显示无控制终端的进程。
其他选项就好理解很多 比如小写的g代表组名,u代表用户名
大写的G代表gid,U代表uid,p代表pid
基本使用
普通地使用ps命令的话会显示和当前的shell相关的进程的相关信息,包括进程id,时间和命令名称,这些是一个进程最基本的信息。
上面有一个列叫做tty就顺便提一下,tty最早是指电脑的输入方式的一种:teletype,现在多用来指终端模拟器,比如现在连接到虚拟机的终端就是pts,这是虚拟终端的一种。在pts的右边有个数字0代表的是这是0号终端
如果我们用新的ssh会话登录到这个机器,再用ps查看的话就会看到新的会话变成pts/1了
当然以上这是一个ps命令最基本的信息
ps -A 显示所有进程 等效于 ps -e
但是因为经常使用ps -ef 的组合,所以使用ps -e的时候就更多一些,毕竟都是小写
ps -C 通过命令名来查看进程
比如一个工具ssh,我们不知道他的进程号多少不知道拥有者和组是什么,我们只知道使用了这个命令,那么就很适合用-C来查看进程,在键盘上敲了什么命令,就用什么名字查找
ps -f 显示关于进程的全格式信息
通常来说 -e 是显示全部的进程,-f 是显示每个进程的全部常用信息,所以为了最大化对进程的搜索,通常会看到一种写法:
ps -ef | grep "xxx" 这种写法翻译过来就是,显示所有进程的全格式信息,然后抓取包含xxx的条目
全格式根据下图显示,依次是:
用户ID,进程ID,父进程ID,CPU使用率,进程开始时间,终端类型,进程占用CPU的时间,命令名
虽然叫做全格式,但是并不是进程的所有信息都在上面,毕竟后面还有个flag叫做显示长格式,但是对于绝大多数情景,ps -f 已经完全够用
ps -j 显示进程的作业格式
作业格式也是经常在服务器开发的时候会听到的,作业控制实际上就是对进程的执行的细致化控制,比如执行,挂起,后台执行,结束进程。一般涉及多任务处理或者长进程处理的时候就会用到作业控制(挖坑到fg和bg的时候填坑吧)
作业格式包括如下信息,依次是:
进程ID 进程组ID 会话ID 终端 CPU占用时间 命令名
ps -l 显示进程的长格式
除了常见的UID PID TTY之类的不再赘述,主要说说之前没见过的一些信息
F 标志(很遗憾书上看到过,具体还没使用过)
S 进程状态信息,一共有三种,睡眠(S),停止(T),执行(R),如下图所示ps就是R,运行中
PRI 进程的优先级(调度的时候的指标之一)
NI 优先级的一种补充值,根据官方文档叫做NICE值(啧嘴老人:啧,nice~)
ADDR 进程的内存地址,但是我的redhat上似乎不显示
SZ 进程使用的内存页数
WCHAN 显示现在正在等待的资源,对于处理阻塞有重大作用,不显示就是没有发生资源等待
总的来说,使用到长格式的开发人员很少,对于我这种云平台开发人员来说还真没实际用过内存地址这种看起来就掉头发的参数
ps -m 按照内存占用的大小排序
ps -r 只显示正在运行中的进程
也就是说只显示刚才介绍的长格式中的S为R的进程
睡眠或者停止的进程都不显示
ps -u 指定用户名
ps -U 指定用户id
和指定用户名的结果是一样的,就是看想起哪个就指定哪个
ps -g 指定组名
略 ps -g root 指定root组
ps -G 指定组ID
略 ps -G 0 指定root组(用组id)
综合使用
上面的那么多flag实际上可以组合使用
除了最常用的 ps -ef之外,只要是线性无关的flag就可以一起用
比如 ps -ef -U 0 指定了uid为0的用户(也就是root)的所有进程的所有信息
ps -G 1001 -Me 指定组id为1001的用户们的所有进程,并且显示线程信息(干嘛用的)
祝玩得愉快