引言

一般熟悉计算机的人员都知道,程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程是在CPU及内存中处于动态执行状态的计算机程序。在Linux系统上,每个程序启动后可以创建一个或多个进程。例如,提供web服务的httpd程序,当有大量客户端访问web页面时,httpd程序可能会创建多个进程来提供服务。为了给用户更好的访问体验,需要随时关注后台进程的运行状态,以确保服务的正常运行。

而要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程运行状态。Linux系统中,对进程查看的工具很多,例如ps、top、htop、pstree、pgrep等,这里单独说下命令ps的使用。

PS命令的介绍

ps(process status) 命令是LINUX下最常用的进程查看工具,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等。ps命令最常用的是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要查看某个后台进程的具体情况,可以使用PS命令,总之大部分信息都是可以通过执行该命令得到的。

注意:ps命令工具显示的是进程的瞬间状态,并不动态连续显示;如果想对进程状态进行实时监控应该用top命令。

PS命令的基本使用

PS命令的具体使用,通过执行man ps命令进行查看文档说明,将显示一大堆信息,包括命令PS的作用,描述,选项等信息。其基本使用格式:ps [options]。

说明:

操作系统:centos 7

最后两项仅做了解即可

1、执行不加任何选项的ps命令

[root@centos7 ~]# ps

e7d5ea7242e9bd4f748d49639953969c.png

直接执行不加任何选项的ps命令时,则只显示当前用户会话中打开的进程。第一行为列表标题,包含基本的四个字段,各字段的含义描述如下:

PID:表示该进程的唯一ID号。

TTY或TT:启动进程的终端名。表明该进程在哪个终端上运行。不是从终端启动的进程或与终端机无关的进程则显示为?,另外,tty1-tty6是本机上面的登入者程序,若为pts/0等,则表示为由网络连接进主机的程序。

TIME:该进程使用CPU的累计时间

CMD: 该进程所运行的命令

2、使用标准语法(Unix风格)查看系统上的每个进程

[root@centos7 ~]# ps -ef

a0fbd88b9a4bab460db416be87c08091.png

选项:

-e:显示系统内的所有进程信息。与-A选项功能相同。

-f:使用完整的(full)格式显示进程信息。还会打印命令参数,当与-L一起使用时,将添加NLWP(线程数)和LWP(线程ID)列。

各字段的含义描述如下:

UID:启动该进程的用户的ID号。

PPID:代表该进程的父进程的ID号。

C:进程的CPU处理器利用率。

STIME或START:均表示进程的启动时间

还可以使用-eF选项查看系统内的所有进程信息

[root@centos7 ~]# ps -eF

28ba2d405e85d706c21de170f84c0b39.png

选项:

-F:在-f选项基础上显示额外的完整格式的进程信息。包含SZ、RSS和PSR这三个字段

额外的三个字段描述如下:

SZ:映射到内存中物理页面的大小,包括文本,数据和堆栈空间。这些页面仅由进程单独使用.进程实际占用的内存数。

RSS:resident size,进程所使用的真实常驻内存(物理内存)的大小(以千字节KB为单位)。

PSR:当前分配给该进程的处理器,即进程在哪颗CPU上运行。

3、使用BSD语法查看系统上的每个进程

1】显示当前终端下的所有信息

[root@centos7 ~]# ps ax

0d3f019c269c6da1eadf0cc89ead64df.png

选项:

a:显示当前终端下的所有进程信息,包括其他用户的进程信息。与x选项结合使用可以显示系统中所有进程的信息。

x:显示当前用户在所有终端下的进程信息。

字段描述:

STAT:表示进程的当前状态;

以下是进程状态代码:

R:running,运行或可运行状态(在运行队列中)。正在运行或准备运行的进程。

S:interruptable sleeping,可中断睡眠(等待事件完成)。正在睡眠的进程。

D:uninterruptable sleeping,不可中断的睡眠进程(通常为IO)。

T:stopped,停止或被追踪的进程。由作业控制信号停止。

Z:zombie,失败终止的(“僵死”)进程。

s:session leader,会话层状态。代表的父进程

N:低优先级进程

+:前台进程。在前台进程组中

l:多线程进程。

2】以面向用户的格式显示当前终端下的所有信息

[root@centos7 ~]# ps axu

8c57d21441a30df0f080b9eef051a7ef.png

选项:

u:使用以用户为主的格式输出进程信息。

字段描述:

USER:启动该进程的用户账号名称。

%CPU:代表进程的CPU占用率。该进程使用掉的CPU资源百分比。

%MEM:代表进程的内存占用率。该进程所占用的物理内存百分比;

VSZ:virtual memory size,虚拟内存集,进程占用的虚拟内存(swap空间)的大小(以KB为单位)

4、以进程树结构显示进程

[root@centos7 ~]# ps axjf

90754675cbddaeb5567b807b93f4e5bd.png

选项:

f:以ASCII字符显示进程层次树结构。

j:BSD风格控制格式输出进程信息。

字段描述:

PGID:进程组ID,或者等效的进程组组长的进程ID。

SID:显示进程的登录会话ID

TPGID:进程连接到的tty(终端)上的前台进程组的ID,如果进程未连接到tty,则为-1。

或者使用UNIX风格带f选项的命令也是可以显示进程树结构,例如:

[root@centos7 ~]# ps -ef f

88f6d27a0cf6e864db616542a9696eb1.png

5、获取有关线程的信息

[root@centos7 ~]# ps -efL

41a604cc1f407c0a13a16124dbaf085b.png

选项:

-L:显示线程信息,包含LWP(线程ID)列和NLWP(线程数)

字段描述:

LWP:轻量级进程(线程)的ID号。

NLWP:进程中内核的lwps(线程)数。NLWP,就是线程组中LWP的个数

6、获取安全信息:

[root@centos7 ~]# ps auxZ

26b7ccffab58583e0b4146257f8acf49.png

选项:

Z:添加一列安全上下文。 与-M选项功能(对于SELinux)相同。

字段描述:

LABEL:安全标签,最常用于SELinux上下文数据。 用于在高安全系统上发现的强制访问控制(“MAC”)。

SELinux的安全上下文包括:用户:角色:类型:级别

7、以用户格式查看以root用户身份(实际和有效ID)运行的每个进程

[root@centos7 ~]# ps -U root -u root u

f960c362ade1cac631f9678d04b92d79.png

选项:

-U:按用户列表中真实的用户ID(RUID)或名称进行显示进程

-u:按用户列表中有效用户ID(EUID)或名称进行显示进程。与U和--user相同。

8、按进程的PID号或者进程名查看某个进程下的所有线程。

1】由进程号为<1359>的进程创建的所有线程。

[root@centos7 ~]# ps -T p 1367

[root@centos7 ~]# ps -T -p 1367

[root@centos7 ~]# ps -T q 1367

[root@centos7 ~]# ps -T -q 1367

9c254ba965a53889a896f2d0d253259f.png

选项:

q:pidlist,按进程ID(快速模式)选择进程信息,这将选择进程ID号显示在进程号列表pidlist中的进程。与-q和--quick-pid相同。

-T:显示进程创建的线程信息。

还可以使用-L选项进行查看线程信息,如下

[root@centos7 ~]# ps -L -q 1367

[root@centos7 ~]# ps -L q 1367

[root@centos7 ~]# ps -L p 1367

[root@centos7 ~]# ps -L -p 1367

[root@centos7 ~]# ps -L 1367

624ede7e06b0ef9a47a757ba1f89cc3b.png

2】按进程所运行的命令名查看此进程下的所有线程

[root@centos7 ~]# ps -L -C rsyslogd

[root@centos7 ~]# ps -T -C rsyslogd

4f33cf572edc5377b79fb2b61f71c935.png

SPID与LWP:均轻量级进程(线程)的ID号。

-o选项与o选项用法相同,都是由用户自定义格式输出进程信息。但也有不同之处,单纯使用-o选项只输出用户指定的字段下当前用户会话中打开的进程。而单纯使用o选项则输出用户指定的字段下所有终端用户会话中打开的进程。除了上面自定义标题段为空的用法,还有下列使用方法。

9、当我们不容易理解字段标题含义时,还可以根据需要重命名标题。多个标题字段以逗号分隔。

1】显示当前用户会话中打开的所有进程,包含用户ID、进程ID、父进程ID、运行进程的终端及该进程所运行的命令。

[root@centos7 ~]# ps -o uid=UserID,pid=ProcessID,ppid,tname,comm=CommandName

a59e9a0d147b361dfcc114ca2e22d40d.png

2】显示所有终端用户会话中打开的所有进程,包含用户ID、进程ID、父进程ID、运行进程的终端及该进程所运行的命令。

[root@centos7 ~]# ps o uid=UserID,pid=ProcessID,ppid,tname,comm=ComandName

c5c3c5710e5924b88fbfe602f9098b3b.png

上面是选项-o与选项o的差异之处。如果所有列标题都为空,会是什么情况呢?

[root@centos7 ~]# ps o uid=,pid=,ppid=,tname=,comm=

[root@centos7 ~]# ps-o uid=,pid=,ppid=,tname=,comm=

036a606e2fa517d324f84c136eabb095.png

从上面结果可以看出,如果所有列标题都为空,则不会输出标题行。

3】显式宽度控制

[root@centos7 ~]# ps o pid,ppid,psr,pri,unit,ucmd

[root@centos7 ~]# ps o pid,ppid,psr,pri,unit:20,ucmd

939eef35b2ec1546529f71cace26c446.png

字段描述:

PRI:priority,内核调度优先级。代表这个进程可被执行的优先级,其值越小,优先级就越高,越早被执行。

UNIT:显示进程所属的服务

ucmd:显示该进程所运行的命令名(仅可执行文件名),其用法与comm、ucomm相同。

从上述结果得知,当多个字段标题列宽间距差距过大时,可以根据需要增加列宽标头显式间距,以达到美化输出的效果。

4】综合:自定义输出指定的字段内容

上述显示的基本是当前用户会话终端或所有用户会话终端打开的前台进程,若想显示系统所有的自定义指定字段信息呢?可以配合-e或-A选项显示系统内所有进程信息。

[root@centos7~]#ps -eo gid,%cpu,%mem,user:7,ni,ppid,pid,bsdstart,etime,pri,stat,tname:5,cputime=CpuTime,ucmd

d022aef3ef40a20f679f43fb57c69efd.png

字段描述:

GID:启动该进程的用户组ID号。

NI:进程Nice值,代表这个进程的优先值。Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。

ELAPSED:从进程开始启动以来所运行的时间,以[DD-]hh:mm:ss的形式显示累计时间。

10、重复打印每页标题字段

执行ps aux命令,则以面向用户的格式显示当前终端下的所有信息并输出大量,默认会跳转到输出的进程信息尾部。这样当需要确定某个字段列表下的信息时,还得向上查找字段标题,不方便浏览整体信息。如果加上--headers选项,则会每屏输出一行字段信息,方便进程信息的查看。例如:

[root@centos7 ~]# ps aux --headers

ad216123135bf01b2521d381c3f84d22.png

选项:

--headers:重复标题行,每页输出一行。

11、排序

当使用aux选项查看进程的CPU或内存使用量来进行筛选,从而找出占用资源最多的进程。但默认的输出结果是未排序的,不方便我们用户的查看。有一个好用的选项可以对指定资源进行排序的,可以通过--sort命令选项来排序。例如:

[root@centos7 ~]# ps aux --sort=%mem|tail

[root@centos7 ~]# ps aux --sort %mem|tail

3b86433747a9ba6c2c57656e1d375cc1.png

或者使用ps aux --sort=+%mem|tail和ps aux --sort +%mem|tail命令,输出的结果跟上面截图是一样的,排序后默认的结果是升序显示。代码头%mem前面默认有一个+号,加不加上+结果是一样的,都表示升序。所以字段标题看不到,若想看到字段标题,并从大到小显示,可以在代码头前面使用降序符号‘-’显示。

[root@centos7 ~]# ps aux --sort=-%mem|head

[root@centos7 ~]# ps aux --sort -%mem|head

75c02621113c14fbcf991b70d9135b89.png

12、根据特定条件过滤

1】仅打印某个服务的ID,例如打印syslogd的进程ID

[root@centos7 ~]# ps -C rsyslogd -o pid=

c2cc86a66c7e6d87e70a6e07b65cf7b0.png

选项:

-C:cmdlist,按命令名选择。 即按在命令行列表cmdlist中给出可执行文件名称来选择进程。

-o:用户自定义格式输出。

如果-o后面的参数pid不加等于号,则会输出标题字段和进程号,如下:

[root@centos7 ~]# ps -C rsyslogd -o pid

0a1fd5668c40897726ddc28bf0ba0357.png

2】仅打印进程号PID为5139号进程所运行的命令

[root@centos7 ~]# ps -p 1843 o cmd

[root@centos7 ~]# ps p 1843 o cmd

[root@centos7 ~]# ps --pid 1843 o cmd

30241421766b2485146c23d6581548f8.png

选项:

-p:由PID列表选择进程。即按进程ID号选择显示在pidlist中的进程。与p和--pid相同。

o:指定用户定义的格式。与-o和--format相同。

3】仅显示一个名为sshd的进程信息

809009ddb660d5a3e769167ba7d62645.png

如果想要看到更多的细节,我们可以使用-f选项来完整的显示进程信息。

e6747de7356dc399aede2437bc4f42e8.png

能达到相同的显示结果,还可以使用如下命令

[root@centos7 ~]# ps -ef|grep sshd|grep -v grep

49442bb347694e52151d10a26fce7048.png

13、了解:使用PS实时监控进程状态

由于ps是显示瞬间进程的状态快照,并不能动态连续显示进程的信息,如果我们需要每秒刷新一次CPU和内存的使用率来筛选进程,可以将ps命令和watch命令结合起来使用。

[root@centos7 ~]# watch -d -n 1 'ps aux --sort -pmem,-pcpu'

0cdb16ecae10ee0d20735192fc3b6f26.png

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示。

选项:

-d:高亮显示动态变化的信息

-n:指令执行的间隔时间(秒)

14、了解:查看进程的运行环境

ps a显示当前终端下的所有远程会话中的进程信息,如果我们需要了解系统进程使用了哪些配置参数或必要的执行环境,可以使用e选项来显示进程所运行的系统环境,显示内容包含执行的命令参数、系统预定义的变量等,如下:

[root@centos7 ~]# ps a

[root@centos7 ~]# ps ae

d03287bcd54eb88f122375b315f571b1.png

如上圈红部分内容,系统环境信息没有相对完整的展现出来,可以加ww或-ww选项对输出的内容不受屏幕宽度的限制,保证系统进程信息的完整输出到屏幕中。

[root@centos7 ~]# ps ae ww

25aac5c539d9f51bd43bf204e233baa8.png选项:

e:在命令后显示系统环境。

-ww或ww:不限输出信息。

由于使用ww或-ww选项输出的内容较多,不容易查看进程信息,可以不使用。

以上为ps命令的全部使用方式,不同版本Linux的ps命令支持的选项不尽相同,本文仅供参考,不同之处请执行man ps命令查看本机ps命令文档了解具体选项,本文若有错误之处,欢迎各位不吝指正!

Logo

更多推荐