[一天一个命令]ps

简介

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的进程和进程号(process identification numbers,PIDs)。

ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。

一个进程,或者说一个任务,是一个程序的执行实例。每一个进程会被分配一个唯一的进程号。


用法

最基本的用法为:

1
ps [options]

当不加选项只执行ps命令时。ps输出如下四种信息:

1
PID  |  TTY  |  TIME  |  CMD

然后至少会输出shell和ps的状态。shell作为unix-like系统中传统的文字型交互界面,在linux系统中默认会使用bash(此外还有zsh等等)。ps自身则会在指令打印完后结束。

四个输出中。PID为编号已经解释过了。TIME显示的是进程已经运行的CPU时间,CMD是启动该进程时执行的命令。TTY目前表示进程是在那个终端机上面运作(之前是电传打字机teletype的缩写),若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

主要选项与示例

1
2
3
4
-a      显示所有用户的全部进程,除非使用-x选项,则会跳过没有控制终端的进程(SystemV风格)
a 显示所有进程(BSD风格)
-e 同-A一样
-f 输出uid、pid、parent pid、近期CPU消耗、进程启动时间、controlling tty、elapsed CPU usage, and the associated command.如果同时使用了-u选项,会输出用户名而非uid。当-o或-O跟在-f后面,那么command不会像其他命令执行时一样被阶段

主要使用BSD风格输出为:

1
2
3
ps aux
----------
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND

-a参数可以输出全部用户的全部进程。-u参数输出详细进程信息。-x指令可输出没有控制终端的进程(如开机启动进程或后台等待激活中的进程)
除了前面介绍的参数, VSZ (virtual size in kilobytes), RSS (real memory size or resident set size in 1024 byte units), STAT (the process state code),开始时间, 持续时间等信息都会有。

如果使用SystemV风格则为

1
2
3
ps -ef
----------
UID PID PPID C STIME TTY TIME CMD

-e会输出全部进程,-f则会生成一个简短的状态,使用-l则会显示更长的内容

1
ps -efl

命令会生成一个15列的表格,其中长度太大的会自动省略对齐(如果不用grep这个会比较适合)。

结束进程可以使用:

1
kill 11253

强制结束可用:

1
kill -9 11253

全部命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-A      显示所有终端的所有进程
-a 显示所有用户的全部进程,除非使用-x选项,则会跳过没有控制终端的进程
-C 改变CPU占用比计算方式为raw CPU(一般无变化)
-c 改变CMD输出为执行文件名而非全部指令
-d 同-A一样,不过此命令不输出会话领导进程(见附录中解释)
-E 同时输出环境,但只是输出启动时的环境

-e 同-A一样
-f 输出uid、pid、parent pid、近期CPU消耗、进程启动时间、controlling tty、elapsed CPU usage, and the associated command.如果同时使用了-u选项,会输出用户名而非uid。当-o或-O跟在-f后面,那么command不会像其他命令执行时一样被阶段
-G Display information about processes which are running with the specified real group IDs.

-g Display information about processes with the specified process group leaders.

-h 在每页重复表头
-j 输出一下排序的信息: user, pid, ppid, pgid, sess, jobc, state, tt, time, and command.
-L 列出可用于-O和-o排序的关键词
-l 输出以下内容: uid, pid, ppid, flags, cpu, pri, nice, vsz=SZ, rss, wchan, state=S, paddr=ADDR, tty, time, and command=CMD.
-M 输出每个任务的相关线程
-m 通过内存使用排序,而非通过PID排序输出
-O Add the information associated with the space or comma separated list of keywords specified, after the process ID, in the default information display. Keywords may be
appended with an equals (`=') sign and a string. This causes the printed header to use the specified string instead of the standard header.

-o Display information associated with the space or comma separated list of keywords specified. Multiple keywords may also be given in the form of more than one -o option.
Keywords may be appended with an equals (`=') sign and a string. This causes the printed header to use the specified string instead of the standard header. If all key-
words have empty header texts, no header line is written.
-p 列出特定PID的进程信息
-r 已当前的CPU使用率排序
-S 以所有退出子任务的时间加和作为任务的时间显示
-T 显示当前终端的全部进程
-t 显示特定终端设备的进程
-U 显示属于特定UID的进程
-u 显示属于特定用户名的进程
-v 显示如下内容: pid, state, time, sl, re, pagein, vsz, rss, lim, tsiz, %cpu, %mem, and command. -v指令包含了-m
-w 用132行显示信息(而非用窗口大小的默认值显示)
-X 在显示满足其他筛选条件的进程时,跳过没有控制终端的进程
-x 在显示满足其他筛选条件的进程时,包含没有控制终端的进程(作用与-X相反)

附录

附录1:Linux进程的ID

  • Process ID (PID)
    一个用来表示进程的唯一的数,进程被杀死后可释放用于其他进程
  • Parent Process ID (PPID)
    启动这个进程的母进程的PID
  • Process Group ID (PGID)
    进程组领导进程的PID,如果PID == PGID则该进程是进程组领导进程。
  • Session ID (SID)
    多个进程组可以构成一个会话。SID是会话的领导进程的PID,如果PID == SID则该进程是会话的领导进程。(这个主要是在当年那个时代在一个终端建立一个会话对应多个进程组,可以选取一个进程组作为前台接收指令,其他在后台运行)
    1
    2
    3
    +-----------+        +-----------+       +-----------+
    | Session +--------> Pro Group +-------> Process |
    +-----------+ +-----------+ +-----------+

附录2:Linux进程的状态

程序状态包括:

  • D, uninterruptable sleep;
  • N, low priority;
  • R, runnable (on run queue);
  • S, sleeping;
  • T, traced or stopped;
  • Z, defunct (zombie).