Linux 下 ps 命令详解

Linux系统 gongyj 1086℃ 已收录 0评论

有时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行。由于一个应用程序可能需要启动多个进程。所以在同等情况下,进程的数量要比程序多的多。对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多 的资源等等。总之大部分信息都是可以通过执行该命令得到的。

Linux 中的 ps 命令是 Process Status 的缩写,这个工具能在命令行中使用。ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的,如果想对进程时间监控,应该用 top 工具。

Linux 上进程有 5 种状态:

1、运行(正在运行或在运行队列中等待)

2、中断(休眠中,受阻,在等待某个条件的形成或接受到信号)

3、不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)

4、僵死(进程已终止,但进程描述符存在,直到父进程调用 wait4() 系统调用后释放)

5、停止(进程收到 SIGSTOP, SIGSTP, SIGTIN, SIGTOU 信号后停止运行运行)

ps 工具标识进程的 7 种状态码:

D 不可中断 uninterruptible sleep (usually IO)

R 运行中 runnable (on run queue)

S 中断,处于休眠 sleeping

T 停止或被追踪 traced or stopped

Z 僵死 a defunct ("zombie") process

W 进入内存交换(从内核2.6开始无效)

X 死掉的进程(从来没见过)

ps 常用参数:

a    显示所有进程。
-a   显示同一终端下的所有程序。
-A   显示所有进程。
c    列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
-C   匹配一个进程名字
-e   此参数的效果和指定"-A"参数相同。
e    命令之后显示环境。(如:ps -d e; ps -a e)
-f   全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
f    用 ASCII 字符显示树状结构,表达程序间的相互关系。
-N   反向选择,除了执行 ps 指令终端机下的程序之外。
-d   显示所有进程,但省略所有的会话引线(utility)
-x   显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。
-p   pid 进程使用cpu的时间。
-u   uid or username 选择有效的用户id或者是用户名
u   以用户为主的格式来显示程序状况。
-g   gid or groupname 显示组的所有进程。
U    username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;
x   显示所有程序,不以终端机来区分。
ww   避免详细参数被截断。
-l   长格式(有F,wchan,C 等字段)
-L   查找指定进程的线程
-j   作业格式。
-o   用户自定义格式。
v    以虚拟存储器格式显示。
s    以信号格式显示。
S    列出程序时,包括已中断的子程序资料。
T    显示当前终端的所有程序
-m   显示所有的线程。
-H   显示进程的树状结构,表示程序间的相互关系。(和其它的命令合用,如:ps -Ha)
h    不显示第一行标示

使用实例:

1、显示所有进程信息

[root@localhost ~]# ps -A
  PID TTY          TIME CMD
    1 ?        00:00:00 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 migration/0
    4 ?        00:00:12 ksoftirqd/0
    5 ?        00:00:00 stopper/0
    6 ?        00:00:16 watchdog/0
    7 ?        02:23:24 events/0
    8 ?        00:00:00 cgroup
    9 ?        00:00:00 khelper
   10 ?        00:00:00 netns
   11 ?        00:00:00 async/mgr
   12 ?        00:00:00 pm
   13 ?        00:00:48 sync_supers
   14 ?        00:00:47 bdi-default
   15 ?        00:00:00 kintegrityd/0
   ……              ……

2、显示指定用户信息

[root@localhost ~]# ps -u root
  PID TTY          TIME CMD
    1 ?        00:00:00 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 migration/0
    4 ?        00:00:12 ksoftirqd/0
    5 ?        00:00:00 stopper/0
    6 ?        00:00:16 watchdog/0
    7 ?        02:23:24 events/0
    8 ?        00:00:00 cgroup
    9 ?        00:00:00 khelper
   10 ?        00:00:00 netns
   11 ?        00:00:00 async/mgr
   12 ?        00:00:00 pm
   13 ?        00:00:48 sync_supers
   14 ?        00:00:47 bdi-default
   15 ?        00:00:00 kintegrityd/0
   ……              ……

3、显示所有进程信息,连同命令行

[root@localhost ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jun19 ?        00:00:00 /sbin/init
root         2     0  0 Jun19 ?        00:00:00 [kthreadd]
root         3     2  0 Jun19 ?        00:00:00 [migration/0]
root         4     2  0 Jun19 ?        00:00:12 [ksoftirqd/0]
root         5     2  0 Jun19 ?        00:00:00 [stopper/0]
root         6     2  0 Jun19 ?        00:00:16 [watchdog/0]
root         7     2  0 Jun19 ?        02:23:24 [events/0]
root         8     2  0 Jun19 ?        00:00:00 [cgroup]
root         9     2  0 Jun19 ?        00:00:00 [khelper]
root        10     2  0 Jun19 ?        00:00:00 [netns]
……                  ……             ……
[root@localhost ~]# ps -ef|grep syslog
root      1134     1  0 Jun19 ?        00:00:09 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root     14914 14871  0 11:45 pts/0    00:00:00 grep syslog

4、将目前属于您自己这次登入的 PID 与相关信息列示出来

[root@localhost ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0   674     1 88  80   0 - 801963 futex_ pts/0   00:00:13 java
4 S     0 14871 14868  0  80   0 - 27118 wait   pts/0    00:00:00 bash
4 R     0 14917 14871  0  80   0 - 27033 -      pts/0    00:00:00 ps

各相关信息的意义:

F           代表这个程序的旗标 (flag), 4 代表使用者为 super user

S           代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍

UID       程序被该 UID 所拥有

PID       就是这个程序的 ID !

PPID     则是其上级父程序的ID

C          CPU 使用的资源百分比

PRI       这个是 Priority (优先执行序) 的缩写,详细后面介绍

NI         这个是 Nice 值,CPU 处理的优先级

ADDR   这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 "-"

SZ         使用掉的内存大小

WCHAN 目前这个程序是否正在运作当中,若为 – 表示正在运作

TTY         登入者的终端机位置

TIME       使用掉的 CPU 时间。

CMD       所下达的指令为何

在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有三个 PID。

5、列出目前所有的正在内存当中的程序

[root@localhost ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  19356  1428 ?        Ss   Jun19   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jun19   0:00 [kthreadd]
root        31  0.0  0.0      0     0 ?        SN   Jun19   0:00 [ksmd]
root        32  0.0  0.0      0     0 ?        SN   Jun19   0:34 [khugepaged]
root       366  0.0  0.0  11156   536 ?        S<s  Jun19   0:00 /sbin/udevd -d
root       650  0.0  0.0      0     0 ?        S    Jun19   4:07 [vmmemctl]
root       787  0.0  0.0  11152   556 ?        S<   Jun19   0:00 /sbin/udevd -d
root      1103  0.0  0.0  93156   780 ?        S<sl Jun19   0:25 auditd
root      1134  0.0  0.2 249480  4956 ?        Sl   Jun19   0:09 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
rpc       1179  0.0  0.0  19040   660 ?        Ss   Jun19   0:18 rpcbind
root      1356  0.0  0.0 452696  1596 ?        Ssl  Jun19   2:02 automount --pid-file /var/run/autofs.pid
root      1588  0.0  0.0   4064   540 tty2     Ss+  Jun19   0:00 /sbin/mingetty /dev/tty2
root     14935  0.0  0.0 110236  1124 pts/0    R+   11:53   0:00 ps aux

各相关信息的意义:

USER:该 process 属于那个使用者账号的

PID :该 process 的号码

%CPU:该 process 使用掉的 CPU 资源百分比

%MEM:该 process 所占用的物理内存百分比

VSZ :该 process 使用掉的虚拟内存量 (Kbytes)

RSS :该 process 占用的固定的内存量 (Kbytes)

TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

STAT:该程序目前的状态,主要的状态有

R :该程序目前正在运作,或者是可被运作

S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。

T :该程序目前正在侦测或者是停止了

Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态

< :高优先级
N :低优先级
L :有些页被锁进内存
s :包含子进程
+:位于后台的进程组;

l:多线程,克隆线程  multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

L :内存锁页

START:该 process 被触发启动的时间

TIME :该 process 实际使用 CPU 运作的时间

COMMAND:该程序的实际指令

[root@localhost ~]# ps lax
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0  19356  1428 poll_s Ss   ?          0:00 /sbin/init
1     0     2     0  20   0      0     0 kthrea S    ?          0:00 [kthreadd]
1     0     3     2 -100  -      0     0 migrat S    ?          0:00 [migration/0]
5     0  1103     1  16  -4  93156   780 ep_pol S<sl ?          0:25 auditd
5     0  1134     1  20   0 249480  4956 poll_s Sl   ?          0:09 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
5    32  1179     1  20   0  19040   660 poll_s Ss   ?          0:18 rpcbind
5    81  1195     1  20   0  22160  1596 poll_s Ss   ?          0:01 dbus-daemon --system
5    29  1215     1  20   0  23348  1280 poll_s Ss   ?          0:00 rpc.statd
4     0  1246     1  20   0 189560  3284 ep_pol Ss   ?          0:00 cupsd -C /etc/cups/cupsd.conf
1     0  1275     1  20   0   4080   640 poll_s Ss   ?          0:00 /usr/sbin/acpid
5    68  1285     1  20   0  39108  2604 poll_s Ssl  ?          1:04 hald

PPID:父进程

WCHAN:正在等待的进程资源

6、列出类似程序树的程序显示

[root@localhost ~]# ps axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2     4     0     0 ?           -1 S        0   0:12  \_ [ksoftirqd/0]
    2     5     0     0 ?           -1 S        0   0:00  \_ [stopper/0]
    2     6     0     0 ?           -1 S        0   0:16  \_ [watchdog/0]
    2     7     0     0 ?           -1 S        0 143:25  \_ [events/0]
    0     1     1     1 ?           -1 Ss       0   0:00 /sbin/init
    1   366   366   366 ?           -1 S<s      0   0:00 /sbin/udevd -d
  366   787   366   366 ?           -1 S<       0   0:00  \_ /sbin/udevd -d
  366   788   366   366 ?           -1 S<       0   0:00  \_ /sbin/udevd -d
    1  1103  1103  1103 ?           -1 S<sl     0   0:25 auditd
    1  1134  1130   872 ?           -1 Sl       0   0:09 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
    1  1179  1179  1179 ?           -1 Ss      32   0:18 rpcbind
    1  1195  1195  1195 ?           -1 Ss      81   0:01 dbus-daemon --system
    1  1215  1215  1215 ?           -1 Ss      29   0:00 rpc.statd
    1  1246  1246  1246 ?           -1 Ss       0   0:00 cupsd -C /etc/cups/cupsd.conf
    1  1275  1275  1275 ?           -1 Ss       0   0:00 /usr/sbin/acpid
    1  1285  1285  1285 ?           -1 Ssl     68   1:04 hald
 1285  1286  1285  1285 ?           -1 S        0   0:00  \_ hald-runner
 1286  1330  1285  1285 ?           -1 S        0   0:00      \_ hald-addon-input: Listening on /dev/input/event0 /dev/input/event2
 1286  1336  1285  1285 ?           -1 S       68   0:00      \_ hald-addon-acpi: listening on acpid socket /var/run/acpid.socket

7、输出进程状态的指定字段

命令格式:ps -eo user,stat..,cmd

user             用户名
uid              用户号
pid              进程号
ppid             父进程号
tpgid            控制 tty 进程组 ID 
size             内存大小, Kbytes字节
vsize            总虚拟内存大小, bytes字节(包含code+data+stack)
share            总共享页数
nice             进程优先级(缺省为0, 最大为-20)
priority(pri)    内核调度优先级
pmem             进程分享的物理内存数的百分比
trs              程序执行代码驻留大小
rss              进程使用的总物理内存数, Kbytes字节
time             进程执行起到现在总的CPU暂用时间
stat             进程状态
flags            长模式标志
pgrp             进程的组 ID
cutime           累计用户时间
cstime           累计系统时间
utime            用户时间
stime            系统时间
min_flt          次要页错误的数量
maj_flt          主要页错误的数量
cmin_flt         累计次要页错误
cmaj_flt         累计主要页错误
session          对话 ID
resident         驻留页
tty              tty 次要设备号
start_time       进程启动的时间
cmd(args)        执行命令的简单名称
command          完整命令行

查看当前系统进程的 uid,pid,stat,pri, 以 uid 号排序:

[root@localhost ~]# ps -eo pid,stat,pri,uid --sort uid
  PID STAT PRI   UID
    1 Ss    19     0
    2 S     19     0
    3 S    139     0
    4 S     19     0
    5 S    139     0
    6 S    139     0
    7 S     19     0
    8 S     19     0
    9 S     19     0
   10 S     19     0

查看当前系统进程的 user,pid,stat,rss,args,以 rss 排序:

[root@localhost ~]# ps -eo user,pid,stat,rss,args --sort rss
USER       PID STAT   RSS COMMAND
root         2 S        0 [kthreadd]
root         3 S        0 [migration/0]
root         4 S        0 [ksoftirqd/0]
root      1542 Ss     508 /usr/sbin/atd
root       366 S<s    536 /sbin/udevd -d
root      1575 Ss     540 rsync --daemon --config=/etc/rsyncd/rsyncd.conf
root      1597 Ss+    540 /sbin/mingetty /dev/tty6
root       787 S<     556 /sbin/udevd -d
root      1275 Ss     640 /usr/sbin/acpid
rpc       1179 Ss     660 rpcbind
root     18014 S      672 udisks-daemon: polling /dev/sr0
root      1103 S<sl   780 auditd
68        1336 S     1016 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
root      1517 Ss    1068 /usr/sbin/abrtd
root      1330 S     1080 hald-addon-input: Listening on /dev/input/event0 /dev/input/event2

默认情况下,ps命令只显示前台运行的程序,而不会显示后台运行的程序在使用 ps 命令时,如果不采用任何的可选项,则其显示的信息是非常有限的,而且往往只显示当前用户所运行的程序。当系统管理员需要知道应用程序更加详细的运行信息时,如想要知道这个应用程序内存、CPU 的占用率情况时,那么就需要加入一些可选项。关于上面各个字段所代表的含义,大家若有兴趣的话可以查看相关的帮助。一般来说,系统管理员关心的只是程序的 PID 号码、内存与 CPU 的使用率、命令的名字、用户采用的终端等等,其它的信息对于系统管理员来说价值不是很大。

不同版本的 Linux 操作系统中,要显示后台进程其所采用的可选项是不同的,如果系统管理员在使用一个新版本的操作系统时, 不知道要显示全部进程该使用哪个可选项时,可以利用 ps –help 等命令来查看系统帮助。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/235.html
喜欢 (2)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……