为了查阅系统上面正在运行当中的程序,可以利用静态的ps或者是动态的top,本文就来介绍ps的相关用法。

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。

要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。

ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。

kill 命令用于杀死进程。

1
2
3
# ps aux <== 观察系统所有的程序数据
# ps -lA <== 观察系统所有的程序数据
# ps axjf <== 连同部分程序树

选项与参数:
-A:所有的不同process均显示出来,与-e具有同样的效果。
-a:不与terminal有关的所有process。
-u:有效使用者(effective user)相关的process。
-e:列出所有程序,与-A效果相同。
x:通常与a这个参数一起使用,可列出完整的信息。
l:较长、较详细的输出该该PID的信息。
j:工作的格式(jobs format)。
-f:做一个更为完整的输出。

实例:仅观察自己的bash相关程序:ps -l
描述:ps默认只显示属于当前用户这次登录的PID与相关信息,-l参数显示更详细的信息。
命令:ps -l
输出:

1
2
3
4
# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 16215 16213  0  80   0 - 28845 wait   pts/1    00:00:00 bash
0 R     0 16308 16215  0  80   0 - 37232 -      pts/1    00:00:00 ps

每个字段具体的含义如下:

  • F:代表这个程序的旗标(process flags),说明这个程序的总结权限,常见的有:
    • 若为4表示此程序的权限为root。
    • 若为1表示此子程序仅进行复制(fork)而没有实际执行(exec)。
  • S:代表这个程序的状态(STAT),主要的状态有:
    • R(Running):该程序正在运行中。
    • S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    • D:不可被唤醒的睡眠状态,例如,程序可能在等待I/O的情况。
    • T:停止状态(stop),可能是在工作控制(背景暂停)或出错(traced)状态。
    • Z:僵尸(Zombie)状态,程序已经终止但却无法被移除到内存外。
  • UID/PID/PPID:代表程序被该UID所拥有/程序的PID号码/程序的父程序PID号码。
  • C:代表CPU使用率,单位为百分比。
  • PRI/NI:Priority/Nice的缩写,代表程序被CPU所执行的优先顺序,数值越小代表程序越快被CPU执行。
  • ADDR/SZ/WCHAN:都与内存有关,ADDR是kernel function,指出该程序在内存的哪个部分,如果是个running的程序,一般就会显示“-”,SZ代表程序用掉多少内存,WCHAN表示目前程序是否运行中,同样的,若为-表示正在运行中。
  • TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口(pts/n)。
  • TIME:使用掉的CPU时间,此程序实际花费CPU运行的时间,而不是系统时间。
  • CMD:command的缩写,造成此程序的出发程序是什么。

实例:显示指定用户信息
描述:列出指定用户的进程信息。
命令:ps -u root
输出:

1
2
3
4
5
# ps -u root
  PID TTY          TIME CMD
    1 ?        00:00:01 systemd
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 ksoftirqd/0

实例:显示所有进程信息,连同命令行
描述:-e参数与-A参数一样显示所有进程信息,-a将不显示命令行。
命令:ps -ef
输出:

1
2
3
4
5
6
7
# ps -ef
OR
# ps -Af
	UID        PID  PPID  C STIME TTY          TIME CMD
	root         1     0  0 Jun02 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
	root         2     0  0 Jun02 ?        00:00:00 [kthreadd]
	...

实例:观察系统所有程序
描述:列出目前所有的正在内存当中的程序,ps aux会依照PID的顺序来排序显示。
命令:ps aux
输出:

1
2
3
4
# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  43212  3532 ?        Ss   Jun02   0:01 /usr/lib/system
root         2  0.0  0.0      0     0 ?        S    Jun02   0:00 [kthreadd]

各个字段的意义:

  • User:该process属于哪个使用者账号。
  • PID:该process使用掉的CPU资源百分比。
  • %CPU:该process所占用的实体内存百分比。
  • %MEM:该process所占用的实体内存百分比。
  • VSZ:该process使用掉的虚拟内存量(KBytes)。
  • RSS:该process占用的固定的内存量(KBytes)。
  • TTY:该process是在哪个终端机上面运行,若与终端机无关则显示?。另外,tty1-tty6是本机上面的登陆者程序,如果是pts/0等等的,则表示为网络连接的主机程序。
  • STAT:该process目前的状态,状态显示与ps -l的S旗标相同(R/S/T/Z)。
  • START:该process被触发启动的时间。
  • TIME:该process实际使用CPU运行的时间。
  • COMMAND:该process的实际指令是什么。

实例:找出指定程序。
描述:通过ps打印出所有的process信息,再使用grep过滤结果信息,查找指定程序的PID。
命令:ps aux | egrep ‘(cron|syslog)’
输出:

1
2
3
4
5
# ps aux | egrep '(cron|syslog)'
root       450  0.0  0.0 126220  1604 ?        Ss   Jun02   0:00 /usr/sbin/crond -n
root       687  0.0  0.2 224044  5332 ?        Ssl  Jun02   0:00 /usr/sbin/rsyslogd -n
root      1029  0.0  0.0 122032  1488 ?        Sl   Jun02   0:43 /usr/local/cloudmonitor/wrapper/bin/./wrapper /usr/local/cloudmonitor/wrapper/bin/../conf/wrapper.conf wrapper.syslog.ident=cloudmonitor wrapper.pidfile=/usr/local/cloudmonitor/wrapper/bin/./cloudmonitor.pid wrapper.daemonize=TRUE wrapper.name=cloudmonitor wrapper.displayname=cloudmonitor wrapper.statusfile=/usr/local/cloudmonitor/wrapper/bin/./cloudmonitor.status wrapper.java.statusfile=/usr/local/cloudmonitor/wrapper/bin/./cloudmonitor.java.status wrapper.lockfile=/var/lock/subsys/cloudmonitor wrapper.script.version=3.5.27
root     16939  0.0  0.0 112644   980 pts/3    R+   12:32   0:00 grep -E --color=auto (cron|syslog)

实例:显示程序树
描述:显示类似程序树的进程信息。
命令:ps -axjf
输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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  \_ [ksoftirqd/0]
...
15920 15922 15922 15922 pts/2    15922 Ss+      0   0:00  |   \_ -bash
 2099 16451 16451 16451 ?           -1 Ss       0   0:00  \_ sshd: root@pts/3
16451 16453 16453 16453 pts/3    16550 Ss       0   0:00      \_ -bash
16453 16499 16499 16453 pts/3    16550 S        0   0:00          \_ bash
16499 16511 16511 16453 pts/3    16550 S        0   0:00              \_ sudo su -
16511 16512 16511 16453 pts/3    16550 S        0   0:00                  \_ su -
16512 16513 16513 16453 pts/3    16550 S        0   0:00                      \_ -bash
16513 16530 16530 16453 pts/3    16550 S        0   0:00                          \_ bash
16530 16550 16550 16453 pts/3    16550 R+       0   0:00                              \_ ps -axjf

进阶:使用管道与其他命令

实例:使用管道与其他命令
描述:列出目前所有的正在内存当中的程序,ps aux会依照PID的顺序来排序显示,只显示排在前面的一部分数据。
命令:ps -aux | head

实例:列出目前所有的正在内存当中的程序,ps aux会依照PID的顺序来排序显示,只显示排在前面的一部分数据。
命令:ps -aux > out.txt

实例:指定显示的格式。
描述:-o显示指定的格式输出,–sort=-%mem指定以倒序显示程序。
命令:ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%mem | head
输出:

1
2
3
4
5
6
7
8
9
10
11
# ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
  PID  PPID CMD                         %MEM %CPU
 1248  1029 /usr/local/cloudmonitor/jre  3.6  0.4
  690     1 /usr/bin/python -Es /usr/sb  0.8  0.0
  976     1 /usr/local/aegis/aegis_clie  0.6  0.1
  423     1 /usr/lib/polkit-1/polkitd -  0.6  0.0
16409  2099 sshd: root@pts/0             0.3  0.0
15920  2099 sshd: root@pts/2             0.3  0.0
16213  2099 sshd: root@pts/1             0.3  0.0
16451  2099 sshd: root@pts/3             0.3  0.0
  687     1 /usr/sbin/rsyslogd -n        0.2  0.0

参考:

https://www.tecmint.com/find-linux-processes-memory-ram-cpu-usage/