Linux 中 使用 ps 命令查看进程

2018-12-06 08:25:21 +0800 CST

当程序运行在系统上时,我们称之为进程(process)。想查看这些进程,需要我们熟悉 ps 命令的用法。ps 命令好比工具中的瑞士军刀,它能输出在系统上的所有程序的许多信息。

默认情况下,ps 命令不会提供那么多信息:

shellbaike.com # ps
  PID TTY          TIME CMD
31548 pts/0    00:00:00 bash
31569 pts/0    00:00:00 ps

如上所示,它只输出进程号(PID)、 进程运行的终端(TTY)、以及进程已用的CPU时间。

当然,ps 还有很多参数,使用这些参数可以提取更多有用的进程信息:

-A列出所有的行程
-w显示加宽可以显示较多的资讯
-au显示较详细的资讯
-aux显示所有包含其他使用者的行程
au(x)输出格式 :
USERPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER行程拥有者
PIDpid
%CPU占用的 CPU 使用率
%MEM占用的记忆体使用率
VSZ占用的虚拟记忆体大小
RSS占用的记忆体大小
TTY终端的次要装置号码 (minor device number of tty)
STAT该行程的状态:
D不可中断的静止 (通悸□□缜b进行 I/O 动作)
R正在执行中
S静止状态
T暂停执行
Z不存在但暂时无法消除
W没有足够的记忆体分页可分配
<高优先序的行程
N低优先序的行程
L有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
START行程开始时间
TIME执行的时间
COMMAND所执行的指令

这里我们可以使用最常见的 -ef 命令:

shellbaike.com # ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         2     1  0 May08 ?        00:00:00 [kthreadd/51263]
root         3     2  0 May08 ?        00:00:00 [khelper/51263]

这个例子中的两个参数,-e 参数制定显示所有运行在系统上的进程,-f参数则扩展了输出。其中 ps -ef 命令中各信息的含义:

UID:启动进程的用户

PID:进程的进程号

PPID:父进程的进程号

C:进程生命周其忠的CPU利用率

STIME:进程启动时的系统时间

TTY:进程启动时的终端设备

TIME:运行进程需要的累计CPU时间

CMD:启动的程序名称

如果想要更多信息,可以使用 -l 参数:

shellbaike.com # ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 31548 31546  0  80   0 -  2861 wait   pts/0    00:00:00 bash
4 R     0 31678 31548  0  80   0 -  2815 -      pts/0    00:00:00 ps

F:内核分配给进程的系统标记

S:进程的状态(0 代表正在运行;S代表在休眠;R代表可运行,正在等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止)

PRI:进程的优先级(越大的数字代表越低的优先级)

NI:谦让度(nice)值用来参与决定优先级

SZ:假如进程被换出,锁需要交换的大致大小

WCHAN:进程休眠的内核参数的地址

在这里,我们还提出一个很有用的 -H 参数。-H 参数能把输出的进程组织成一个层级的格式,你可以很轻松地看懂哪些进程启动了哪些进程,这里我们结合-ef参数一起演示:

shellbaike.com # ps -efH
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May08 ?        00:03:57 init
root         2     1  0 May08 ?        00:00:00   [kthreadd/51263]
root         3     2  0 May08 ?        00:00:00     [khelper/51263]
root       160     1  0 May08 ?        00:00:00   /sbin/udevd -d
root       514     1  0 May08 ?        00:33:52   /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 

注意这里CMD这一列的评议,它表明运行中程序的层级关系。