ps 命令
ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。
ps 命令的基本格式如下:
[root@localhost ~]# ps aux
#查看系统中所有的进程,使用 BS 操作系统格式
[root@localhost ~]# ps -le
#查看系统中所有的进程,使用 Linux 标准命令格式
| 选项 | 描述 | 
| a: | 显示一个终端的所有进程,除会话引线外; | 
| u: | 显示进程的归属用户及内存的使用情况; | 
| x: | 显示没有控制终端的进程; | 
| -l: | 长格式显示更加详细的信息; | 
| -e: | 显示所有进程; | 
ps 命令有些与众不同,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是前面不能带“-”。
如果执行 "man ps" 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。
所以,建议记忆几个固定选项即可。比如:
- "ps aux" 可以查看系统中所有的进程;
- "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
- "ps -l" 只能看到当前 Shell 产生的进程;
有这三个命令就足够了,下面分别来查看。
例
[root@localhost ~]# ps aux
#查看系统中所有的进程
USER PID %CPU %MEM  VSZ  RSS   TTY STAT START TIME COMMAND
root   1  0.0  0.2 2872 1416   ?   Ss   Jun04 0:02 /sbin/init
root   2  0.0  0.0    0    0   ?    S   Jun04 0:00 [kthreadd]
root   3  0.0  0.0    0    0   ?    S   Jun04 0:00 [migration/0]
root   4  0.0  0.0    0    0   ?    S   Jun04 0:00 [ksoftirqd/0]
…省略部分输出…
ps命令输出信息含义
| 表头 | 含义 | 
| USER | 该进程是由哪个用户产生的。 | 
| PID | 进程的 ID。 | 
| %CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 | 
| %MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 | 
| VSZ | 该进程占用虚拟内存的大小,单位为 KB。 | 
| RSS | 该进程占用实际物理内存的大小,单位为 KB。 | 
| TTY | 该进程是在哪个终端运行的。 其中,tty1 ~ tty7 代表本地控制台终端
 (可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),
 tty1~tty6 是本地的字符界面终端,tty7 是图形终端。
 pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,
 第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。
 | 
| STAT | 进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
 -R:该进程正在运行。
 -S:该进程处于睡眠状态,可被唤醒。
 -T:停止状态,可能是在后台暂停或进程处于除错状态。
 -W:内存交互状态(从 2.6 内核开始无效)。
 -X:死掉的进程(应该不会出现)。
 -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
 -<:高优先级(以下状态在 BSD 格式中出现)。
 -N:低优先级。
 -L:被锁入内存。
 -s:包含子进程。
 -l:多线程(小写 L)。
 -+:位于后台。
 | 
| START | 该进程的启动时间。 | 
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 | 
| COMMAND | 产生此进程的命令名。 | 
例
"ps aux"命令可以看到系统中所有的进程,"ps -le"命令也能看到系统中所有的进程。由于 "-l" 选项的作用,所以 "ps -le" 命令能够看到更加详细的信息,比如父进程的 PID、优先级等。但是两个命令的基本作用是一致的,掌握其中一个就足够了。
[root@localhost ~]# ps -le
F S UID PID PPID C  PRI Nl ADDR  SZ WCHAN TTY      TIME  CMD
4 S   0   1    0 0  80   0 -    718 -     ?    00:00:02  init
1 S   0   2    0 0  80   0 -      0 -     ?    00:00:00  kthreadd
1 S   0   3    2 0 -40   - -      0 -     ?    00:00:00  migration/0
1 S   0   4    2 0  80   0 -      0 -     ?    00:00:00  ksoflirqd/0
1 S   0   5    2 0 -40   - -      0 -     ?    00:00:00  migration/0
…省略部分输出…
ps -le 命令输出信息
| 表头 | 含义 | 
| F | 进程标志,说明进程的权限,常见的标志有两个: 进程可以被复制,但是不能被执行;
 进程使用超级用户权限;
 | 
| S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; | 
| UID | 运行此进程的用户的 ID; | 
| PID | 进程的 ID; | 
| PPID | 父进程的 ID; | 
| C | 该进程的 CPU 使用率,单位是百分比; | 
| PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行; | 
| NI | 进程的优先级,数值越小,该进程越早被执行; | 
| ADDR | 该进程在内存的哪个位置; | 
| SZ | 该进程占用多大内存; | 
| WCHAN | 该进程是否运行。"-"代表正在运行; | 
| TTY | 该进程由哪个终端产生; | 
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; | 
| CMD | 产生此进程的命令名; | 
例
如果不想看到所有的进程,只想查看一下当前登录产生了哪些进程,那只需使用 "ps -l" 命令就足够了:
[root@localhost ~]# ps -l
#查看当前登录产生的进程
F S UID   PID  PPID C PRI NI ADDR SZ WCHAN TTY       TIME CMD
4 S 0   18618 18614 0  80  0 - 1681  -     pts/1 00:00:00 bash
4 R 0   18683 18618 4  80  0 - 1619  -     pts/1 00:00:00 ps
可以看到,这次从 pts/1 虚拟终端登录,只产生了两个进程:一个是登录之后生成的 Shell,也就是 bash;另一个是正在执行的 ps 命令。
僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中,这就是僵尸进程。
僵尸进程会对主机的稳定性产生影响,所以,在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制中止。