Linux ps 命令功能很强大,了解 ps 命令首先需要从 ps 命令的选项格式入手。像其他很多 linux shell 命令一样,ps 命令的选项也有长格式和短格式的区别。短选项中也可以带中横线、也可以不带中横线。

根据选项长短和是否有横线的情况,ps 命令的选项可以分为以下 3 类:

BSD 风格语法,必须不能以中横线开头,如 px aux
SYSV/UNIX 风格语法,必须仅一个中横线开头;
GNU 风格语法,必须以两个中横线开头;

也就是说PS命令必须要考虑或者兼容不同风格语法,故而不能随意进行组合。PS命令是一系列固定组合命令。

实例如下

BSD风格

#BSD风格
[root@localhost ~]# ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1259 0.0 3.1 290964 30952 tty1 Ssl+ 00:40 0:01 /usr/bin/X :0 -background none -noreset -audit 4 -verbose -auth /run/
root 9212 0.1 0.3 116668 3280 pts/0 Ss 09:57 0:00 -bash
root 9253 0.0 0.1 155372 1864 pts/0 R+ 09:58 0:00 ps u

SYSV风格/UNIX风格

#SYSV风格/UNIX风格
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 9212 9206 0 80 0 - 29167 do_wai pts/0 00:00:00 bash
0 R 0 9254 9212 0 80 0 - 38312 - pts/0 00:00:00 ps

GNU风格

#GNU风格
[root@localhost ~]# ps --pid 1
PID TTY TIME CMD
1 ? 00:00:07 systemd

【1】什么是PS命令

这个命令用的太多太多,各种各样的版本,如查看系统中tomcat进程:

ps -ef|grep tomcat

ps aux |grep tomcat

Linux中ps 命令使用详解_ps

简解

ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。


语法:

ps(选项)

选项说明如下:

-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 
a:显示现行终端机下的所有程序,包括其他用户的程序。
-A:显示所有程序。
-c:显示CLS和PRI栏位。
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
-d:显示所有程序,但不包括阶段作业领导者的程序。
-e:此选项的效果和指定"A"选项相同。
e:列出程序时,显示每个程序所使用的环境变量。
-f:显示UID,PPIP,C与STIME栏位。
f:用ASCII字符显示树状结构,表达程序间的相互关系。
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
g:显示现行终端机下的所有程序,包括群组领导者的程序。
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
h:不显示标题列。
-H:显示树状结构,表示程序间的相互关系。
-j或j:采用工作控制的格式显示程序状况。
-l或l:采用详细的格式来显示程序状况。
L:列出栏位的相关信息。
-m或m:显示所有的执行绪。
n:以数字来表示USER和WCHAN栏位。
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。
-p<程序识别码>:指定程序识别码,并列出该程序的状况。
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
r:只列出现行终端机正在执行中的程序。
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
s:采用程序信号的格式显示程序状况。
S:列出程序时,包括已中断的子程序资料。
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
-T:显示现行终端机下的所有程序。
-u<用户识别码>:此选项的效果和指定"-U"选项相同。
u:以用户为主的格式来显示程序状况。
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
U<用户名称>:列出属于该用户的程序的状况。
v:采用虚拟内存的格式显示程序状况。
-V或V:显示版本信息。
-w或w:采用宽阔的格式来显示程序状况。 
x:显示所有程序,不以终端机来区分。
X:采用旧式的Linux i386登陆格式显示程序状况。
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
-<程序识别码>:此选项的效果和指定"p"选项相同。
--cols<每列字符数>:设置每列的最大字符数。
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
--cumulative:此选项的效果和指定"S"选项相同。
--deselect:此选项的效果和指定"-N"选项相同。
--forest:此选项的效果和指定"f"选项相同。
--headers:重复显示标题列。
--help:在线帮助。
--info:显示排错信息。
--lines<显示列数>:设置显示画面的列数。
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
--group<群组名称>:此选项的效果和指定"-G"选项相同。
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。
--user<用户名称>:此选项的效果和指定"-U"选项相同。
--User<用户识别码>:此选项的效果和指定"-U"选项相同。
--version:此选项的效果和指定"-V"选项相同。
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

【2】使用PS命令查看当前系统进程

实例1

[root@bogon ~]# ps -Al|grep nginx
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
1 S 0 3983 1 0 80 0 - 11490 sigsus ? 00:00:00 nginx
5 S 99 3984 3983 0 80 0 - 12125 ep_pol ? 00:00:00 nginx
  • F列是指内核分配给进程的系统标记,说明进程的权限,常见的标志有:
  • 1:进程可以复制,但是不能执行;
  • 4:进程使用超级用户权限
  • STAT:进程状态
  • D:不可被唤醒的睡眠状态,通常用户I/O情况
  • R:该进程正在运行;
  • S:该进程正在睡眠,可被唤醒;
  • T:停止状态,可能是在后台暂停或进程在出错状态
  • W:内存交互状态(从2.6内核开始无效)
  • X:死掉的进程,应该不会出现
  • Z:僵尸进程,进程已经终止但是部分程序还在内存中
  • <:高优先级(以下状态在BSD格式中出现)
  • N:低优先级
  • L:被锁入内存
  • s:包含子进程
  • l:多线程(这是小写的L哦)
  • +:位于后台
  • UID列是指启动这些进程的用户
  • PID:进程号
  • PPID:父进程ID
  • C:该进程的CPU使用率,单位是百分比
  • PRI列是指进程的优先级(数值越小该进程优先级越高,越快被CPU执行)。
  • NI列是指谦让I度值,用来参与决定优先级。
  • ADDR列是指进程的内存地址。
  • SZ列是指假如进程被换出,所需的交换空间在大致大小。
  • WCHAN:该进程是否正在运行。"-"表示正在运行。
  • TTY列是指进程启动时的终端设备。
  • TIME列是指运行进程需要的累计CPU时间。
  • CMD列是指启动的程序名称。

实例2

[root@bogon ~]# ps -ef|grep nginx
UID PID PPID C STIME TTY TIME CMD
root 3983 1 0 11:33 ? 00:00:00 nginx: master process ./nginx
nobody 3984 3983 0 11:33 ? 00:00:00 nginx: worker process
root 7859 6557 0 16:52 pts/0 00:00:00 grep --color=auto nginx

列名字段说明同上。


实例3

[root@bogon ~]# ps aux|grep nginx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3983 0.0 0.1 45960 1120 ? Ss 11:33 0:00 nginx: master process ./nginx
nobody 3984 0.0 0.1 48500 1972 ? S 11:33 0:00 nginx: worker process
root 7861 0.0 0.0 112712 960 pts/0 R+ 16:52 0:00 grep --color=auto nginx
  • VSZ是指进程在内存中的大小,以KB单位。
  • RSS是指进程在未换出时占用的物理内存。
  • STAT:代表当前进程状态的双字符状态码。在STAT双字符状态码中,第一个字符与Unix的S列值一样。后一个字符代表如下:
<: 该进程运行在高优先级上。

N:该进程运行在低优先级上。

L:该进程有页面锁定在内存中。

s: 该进程是控制进程。

l: 该进程是多线程的。

+: 该进程运行在前台。
如S+表示进程状态为后台休眠

指令说明

  • USER:用户名称
  • PID:进程号
  • %CPU:进程占用CPU的百分比
  • %MEM:进程占用物理内存的百分比
  • VSZ:进程占用的虚拟内存大小(单位:KB)
  • RSS:进程占用的物理内存大小(单位:KB)
  • TT:终端名称,缩写.
  • STAT:进程状态
  • D:不可被唤醒的睡眠状态,通常用户I/O情况
  • R:该进程正在运行;
  • S:该进程正在睡眠,可被唤醒;
  • T:停止状态,可能是在后台暂停或进程在出错状态
  • W:内存交互状态(从2.6内核开始无效)
  • X:死掉的进程,应该不会出现
  • Z:僵尸进程,进程已经终止但是部分程序还在内存中
  • <:高优先级(以下状态在BSD格式中出现)
  • N:低优先级
  • L:被锁入内存
  • s:包含子进程
  • l:多线程(这是小写的L哦)
  • +:位于后台
  • START:进程的启动时间
  • TIME:该进程占用CPU的运算时间,注意不是系统时间
  • PPID:父进程ID
  • STIME:进程启动的时间
  • TTY:完整的终端名称
  • COMMAND:启动进程所用的命令和参数,如果过长会被截断显示

关于tty

tty表示该进程是在哪个终端中运行的。其中tty1-tty7代表本地控制台(可通过alt+F1-F7键切换不同的终端),tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端,一般是远程连接的终端。第一个远程连接占用的是pts/0终端,第二个远程连接占用pts/1终端,依次递增。

Linux中ps 命令使用详解_ps_02

【3】栏位及名称对应

[root@bogon ~]# ps L
%cpu %CPU
%mem %MEM
_left LLLLLLLL
_left2 L2L2L2L2
_right RRRRRRRR
_right2 R2R2R2R2
_unlimited U
_unlimited2 U2
alarm ALARM
args COMMAND
atime TIME
blocked BLOCKED
bsdstart START
bsdtime TIME
c C
caught CAUGHT
cgroup CGROUP
class CLS
cls CLS
cmd CMD
comm COMMAND
command COMMAND
context CONTEXT
cp CP
cpuid CPUID
cputime TIME
drs DRS
dsiz DSIZ
egid EGID
egroup EGROUP
eip EIP
esp ESP
etime ELAPSED
etimes ELAPSED
euid EUID
euser EUSER
f F
fgid FGID
fgroup FGROUP
flag F
flags F
fname COMMAND
fsgid FSGID
fsgroup FSGROUP
fsuid FSUID
fsuser FSUSER
fuid FUID
fuser FUSER
gid GID
group GROUP
ignored IGNORED
intpri PRI
ipcns IPCNS
label LABEL
lastcpu C
lim LIM
longtname TTY
lsession SESSION
lstart STARTED
luid LUID
lwp LWP
m_drs DRS
m_size SIZE
m_trs TRS
machine MACHINE
maj_flt MAJFL
majflt MAJFLT
min_flt MINFL
minflt MINFLT
mntns MNTNS
netns NETNS
ni NI
nice NI
nlwp NLWP
nwchan WCHAN
opri PRI
ouid OWNER
pagein PAGEIN
pcpu %CPU
pending PENDING
pgid PGID
pgrp PGRP
pid PID
pidns PIDNS
pmem %MEM
policy POL
ppid PPID
pri PRI
pri_api API
pri_bar BAR
pri_baz BAZ
pri_foo FOO
priority PRI
psr PSR
rgid RGID
rgroup RGROUP
rss RSS
rssize RSS
rsz RSZ
rtprio RTPRIO
ruid RUID
ruser RUSER
s S
sched SCH
seat SEAT
sess SESS
session SESS
sgi_p P
sgi_rss RSS
sgid SGID
sgroup SGROUP
sid SID
sig PENDING
sig_block BLOCKED
sig_catch CATCHED
sig_ignore IGNORED
sig_pend SIGNAL
sigcatch CAUGHT
sigignore IGNORED
sigmask BLOCKED
size SIZE
slice SLICE
spid SPID
stackp STACKP
start STARTED
start_stack STACKP
start_time START
stat STAT
state S
stime STIME
suid SUID
supgid SUPGID
supgrp SUPGRP
suser SUSER
svgid SVGID
svgroup SVGROUP
svuid SVUID
svuser SVUSER
sz SZ
tgid TGID
thcgr THCGR
thcount THCNT
tid TID
time TIME
tname TTY
tpgid TPGID
trs TRS
trss TRSS
tsig PENDING
tsiz TSIZ
tt TT
tty TT
tty4 TTY
tty8 TTY
ucmd CMD
ucomm COMMAND
uid UID
uid_hack UID
uname USER
unit UNIT
user USER
userns USERNS
util C
utsns UTSNS
uunit UUNIT
vsize VSZ
vsz VSZ
wchan WCHAN
wname WCHAN
zone ZONE