首页 > 编程笔记 > Linux笔记 阅读:64

Linux ps命令的用法(非常详细)

ps 是用来静态地查看系统中正在运行的进程的命令。

这个命令有些特殊,它的部分选项不能加入“-”,如命令“ps aux”,其中“aux”是选项,但是这个选项不能加入“-”。这是因为 ps 命令的部分选项需要遵守 BSD 操作系统的格式,所以 ps 命令的常用选项的组合是固定的,其格式如下:
[root@localhost ~]# ps aux
# 查看系统中所有的进程,遵守 BSD 操作系统的格式

[root@localhost ~]# ps -le
# 查看系统中所有的进程,使用 Linux 标准命令的格式
选项:
    a:显示一个终端的所有进程,除会话引线外
    u:显示进程的归属用户及内存的使用情况
    x:显示没有控制终端的进程
    -l:长格式显示,显示更加详细的信息
    -e:显示所有进程,和 -A 选项的作用一致

大家如果执行“man ps”命令查看 ps 命令的帮助,就会发现 ps 命令的选项为了适应不同种类的 UNIX 系统,可用格式非常多,不方便记忆。因此,建议大家记忆几个固定选项即可,例如:
有这三个命令就足够了,下面分别进行查看:
[root@localhost ~]# ps aux
# 查看系统中所有的进程
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  1.7 107192 16712 ?        Ss   13:15   0:01 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize
root         2  0.0  0.0      0     0 ?        S    13:15   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   13:15   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   13:15   0:00 [rcu_par_gp]
...省略部分输出...
这里解释一下“ps aux”命令的输出,如下表所示:

字段 含义
USER 该进程是由哪个用户产生的。
PID 进程的 ID。
%CPU 该进程占用 CPU 资源的百分比,值越高越耗费资源。
%MEM 该进程占用物理内存的百分比,值越高越耗费资源。
VSZ 该进程占用虚拟内存的大小,单位为 KB。
RSS 该进程占用实际物理内存的大小,单位为 KB。
TTY 进程运行的终端:
  • tty1~tty7 为本地控制台终端;
  • pts/0~255 为虚拟终端;
  • “?”表示系统进程,不依赖终端。
STAT 进程状态:
  • D 不可唤醒睡眠;
  • I 空闲内核进程;
  • R 正在运行;
  • S 可唤醒睡眠;
  • T 停止;
  • W 内存交互(已无效);
  • X 死掉的进程;
  • Z 僵尸进程;
  • < 高优先级;
  • N 低优先级;
  • L 被锁入内存;
  • s 含子进程;
  • l 多线程;
  • + 位于后台。
START 该进程的启动时间。
TIME 该进程占用 CPU 的运行时间,不是系统时间。
COMMAND 产生该进程的命令名。


这两个命令的基本作用是一致的,掌握其中一个就足够了,命令如下:
[root@localhost ~]# ps -le
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 - 26798 ep_pol ?        00:00:01 systemd
1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 I     0     3     2  0  60 -20 -     0 rcu_gp ?        00:00:00 rcu_gp
1 I     0     4     2  0  60 -20 -     0 rescue ?        00:00:00 rcu_par_gp
...省略部分输出...
下面来解释一下这个命令的输出,如下表所示:

字段 含义
F 进程标志:
  • 1 表示进程可被复制但不可执行;
  • 4 表示使用超级用户权限。
S 进程状态,与 ps aux 的 STAT 状态一致,但不显示 “<” 以后的状态信息。
UID 运行此进程的用户 ID。
PID 进程的 ID。
PPID 父进程的 ID。
C 进程的 CPU 使用率(百分比)。
PRI 进程优先级,数值越小优先级越高,越早被 CPU 执行。
NI 进程的 nice 值,数值越小越早被执行。
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
0 S     0  2595  2594  0  80   0 -  2224 do_wai pts/4    00:00:00 bash
0 R     0  2720  2595  0  80   0 -  2579 -      pts/4    00:00:00 ps
可以看到,这次从 pts/4 虚拟终端登录,只产生了两个进程:一个是登录之后生成的 shell,也就是 Bash;另一个是正在执行的 ps 命令。

再来说说僵尸进程。僵尸进程的产生一般都是进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中。僵尸进程会对主机的稳定性产生影响,因此在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后将其强制终止。

相关文章