Linux ps命令用法

1、ps命令简介

在Linux系统中,ps(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。

Linux上进程有5种状态

进程状态含义对应ps命令的状态码
运行正在运行或在运行队列中等待R 运行 runnable (on run queue)
中断休眠中, 受阻, 在等待某个条件的形成或接受到信号S 中断 sleeping
不可中断收到信号不唤醒和不可运行, 进程必须等待直到有中断发生D 不可中断 uninterruptible sleep (usually IO)
僵死进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放Z 僵死 a defunct (”zombie”) process
停止进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行T 停止 traced or stopped

ps命令常用参数

命令含义
e显示所有进程,环境变量
f全格式
h不显示标题
l长格式
w宽输出
a显示终端上地所有进程,包括其他用户地进程
r只显示正在运行地进程
x显示没有控制终端地进程
u以用户为主的格式来显示程序状况
au显示较详细的资讯
aux显示所有包含其他使用者的行程
-C<命令>列出指定命令的状况
–lines<行数>每页显示的行数
–width<字符数>每页显示的字符数
–help显示帮助信息
–version显示版本显示

ps -ef 与 ps aux

Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux。这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同。现在的大部分Linux系统都是可以同时使用这两种方式的。

ps -ef 是用标准的格式显示进程的、其格式如下:

image-20191112150412089

UIDPIDPPIDCSTIMETTYCMD
用户ID进程的ID父进程ID进程占用CPU的百分比进程启动的时间该进程在那个终端上运行。若与终端无关,则显示?若为pts/0等,则表示由网络连接主机进程。命令的名称和参数

ps aux 是用BSD的格式来显示、其格式如下:

image-20191112150333659

USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
用户名同上进程占用的CPU百分比占用内存的百分比该进程使用的虚拟內存量(KB)该进程占用的固定內存量(KB)同上进程的状态同上该进程实际使用CPU运行的时间同上

其中STAT状态位常见的状态字符有

1
2
3
4
5
6
7
8
9
10
11
12
13
D      //无法中断的休眠状态(通常 IO 的进程); 
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;

2、ps常用的命令组合

2.1 不加参数执行ps命令

这是一个基本的 ps 使用,在控制台中执行这个命令并查看结果。

img

结果默认会显示4列信息:

  • PID: 运行着的命令(CMD)的进程编号
  • TTY: 命令所运行的位置(终端)
  • TIME: 运行着的该命令所占用的CPU处理时间
  • CMD: 该进程所运行的命令

这些信息在显示时未排序。

2.2 显示所有当前进程

使用 -a参数,-a 代表 all。同时加上x参数会显示没有控制终端的进程。

1
$ ps -ax

这个命令的结果或许会很长。为了便于查看,可以结合less命令和管道来使用。

1
$ ps -ax | less

img

2.3 根据用户过滤进程

在需要查看特定用户进程的情况下,我们可以使用 -u参数。比如我们要查看用户“pungki”的进程,可以通过下面的命令:

1
$ ps -u pungki

img

2.4 通过cpu和内存使用来过滤进程

如果你想把结果按照 CPU 或者内存用量来筛选,这样你就找到哪个进程占用了你的资源。要做到这一点,我们可以使用 aux 参数,来显示全面的信息:

1
$ ps -aux | less

img

2.4.1 根据 CPU 使用来升序排序
1
$ ps -aux --sort -pcpu | less

img

2.4.2 根据内存使用来升序排序
1
$ ps -aux --sort -pmem | less

img

2.4.3 也可以将它们合并到一个命令,并通过管道显示前10个结果
1
$ ps -aux --sort -pcpu,+pmem | head -n 10

2.5 通过进程名和PID过滤

使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:

1
$ ps -C getty

img

通过进程名和PID过滤如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:

1
$ ps -f -C getty

img

2.6 根据线程来过滤进程

如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID

1
$ ps -L 1213

img

2.7 树形显示进程

有时候我们希望以树形结构显示进程,可以使用 -axjf参数。

1
$ ps -axjf

img

或者可以使用另一个命令。

1
$ pstree

img

2.8 显示安全信息

如果想要查看现在有谁登入了你的服务器。可以使用 ps 命令加上相关参数:

1
$ ps -eo pid,user,args

参数 -e 显示所有进程信息,-o 参数控制输出。Pid,UserArgs 参数显示 PID,运行应用的用户和该应用。

img

能够与-e 参数一起使用的关键字是args, cmd, comm, command, fname, ucmd, ucomm, lstart, bsdstart 和 start。

2.9 格式化输出 root 用户(真实的或有效的UID)创建的进程

系统管理员想要查看由root用户运行的进程和这个进程的其他相关信息时,可以通过下面的命令:

1
$ ps -U root -u root u

-U 参数按真实用户 ID(RUID) 筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。

-U 参数用来筛选有效用户 ID(EUID)

最后的 u 参数用来决定以针对用户的格式输出,由 User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几列组成。

这里有上面的命令的输出结果:

img

2.10 使用PS实时监控进程状态

ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。

当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令watch命令结合起来。

1
$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’

img

如果输出太长,我们也可以限制它,比如前20条,我们可以使用 head命**令** 来做到。

1
$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’

img

这里的动态查看并不像 top 或者 htop 命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。

举个例子,如果你只需要看名为“pungki”用户的信息,你可以使用下面的命令:

1
$ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’

img

-------------本文结束感谢您的阅读-------------