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 是用标准的格式显示进程的、其格式如下:
UID | PID | PPID | C | STIME | TTY | CMD |
---|---|---|---|---|---|---|
用户ID | 进程的ID | 父进程ID | 进程占用CPU的百分比 | 进程启动的时间 | 该进程在那个终端上运行。若与终端无关,则显示?若为pts/0等,则表示由网络连接主机进程。 | 命令的名称和参数 |
ps aux 是用BSD的格式来显示、其格式如下:
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
用户名 | 同上 | 进程占用的CPU百分比 | 占用内存的百分比 | 该进程使用的虚拟內存量(KB) | 该进程占用的固定內存量(KB) | 同上 | 进程的状态 | 同上 | 该进程实际使用CPU运行的时间 | 同上 |
其中STAT状态位常见的状态字符有
1 | D //无法中断的休眠状态(通常 IO 的进程); |
2、ps常用的命令组合
2.1 不加参数执行ps命令
这是一个基本的 ps 使用,在控制台中执行这个命令并查看结果。
结果默认会显示4列信息:
- PID: 运行着的命令(CMD)的进程编号
- TTY: 命令所运行的位置(终端)
- TIME: 运行着的该命令所占用的CPU处理时间
- CMD: 该进程所运行的命令
这些信息在显示时未排序。
2.2 显示所有当前进程
使用 -a参数,-a 代表 all。同时加上x参数会显示没有控制终端的进程。
1 | $ ps -ax |
这个命令的结果或许会很长。为了便于查看,可以结合less命令和管道来使用。
1 | $ ps -ax | less |
2.3 根据用户过滤进程
在需要查看特定用户进程的情况下,我们可以使用 -u参数。比如我们要查看用户“pungki”的进程,可以通过下面的命令:
1 | $ ps -u pungki |
2.4 通过cpu和内存使用来过滤进程
如果你想把结果按照 CPU 或者内存用量来筛选,这样你就找到哪个进程占用了你的资源。要做到这一点,我们可以使用 aux 参数,来显示全面的信息:
1 | $ ps -aux | less |
2.4.1 根据 CPU 使用来升序排序
1 | $ ps -aux --sort -pcpu | less |
2.4.2 根据内存使用来升序排序
1 | $ ps -aux --sort -pmem | less |
2.4.3 也可以将它们合并到一个命令,并通过管道显示前10个结果
1 | $ ps -aux --sort -pcpu,+pmem | head -n 10 |
2.5 通过进程名和PID过滤
使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:
1 | $ ps -C getty |
通过进程名和PID过滤如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:
1 | $ ps -f -C getty |
2.6 根据线程来过滤进程
如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。
1 | $ ps -L 1213 |
2.7 树形显示进程
有时候我们希望以树形结构显示进程,可以使用 -axjf参数。
1 | $ ps -axjf |
或者可以使用另一个命令。
1 | $ pstree |
2.8 显示安全信息
如果想要查看现在有谁登入了你的服务器。可以使用 ps 命令加上相关参数:
1 | $ ps -eo pid,user,args |
参数 -e 显示所有进程信息,-o 参数控制输出。Pid,User 和 Args 参数显示 PID,运行应用的用户和该应用。
能够与-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这几列组成。
这里有上面的命令的输出结果:
2.10 使用PS实时监控进程状态
ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。
当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来。
1 | $ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’ |
如果输出太长,我们也可以限制它,比如前20条,我们可以使用 head命**令** 来做到。
1 | $ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’ |
这里的动态查看并不像 top 或者 htop 命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。
举个例子,如果你只需要看名为“pungki”用户的信息,你可以使用下面的命令:
1 | $ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’ |