Linux 进程探查

发布时间 2023-12-20 21:22:02作者: 华小电

想监测Linux进程,需要熟悉 ps 命令的用法。

Linux系统中使用的GNU ps 命令支持3种不同类型的命令行参数:
 Unix风格的参数,前面加单破折线;
 BSD风格的参数,前面不加破折线;
 GNU风格的长参数,前面加双破折线。

1. Unix风格的参数

Unix风格的参数是从贝尔实验室开发的AT&T Unix系统上原有的 ps 命令继承下来的。
Unix风格的ps命令参数

参 数 描 述
-A 显示所有进程
-N 显示与指定参数不符的所有进程
-a 显示除控制进程(session leader )和无终端进程外的所有进程
-d 显示除控制进程外的所有进程
-e 显示所有进程
-C cmdlist 显示包含在cmdlist列表中的进程
-G grplist 显示组ID在grplist列表中的进程
-U userlist 显示属主的用户ID在userlist列表中的进程
-g grplist 显示会话或组ID在grplist列表中的进程
-p pidlist 显示PID在pidlist列表中的进程
-s sesslist 显示会话ID在sesslist列表中的进程
-t ttylist 显示终端ID在ttylist列表中的进程
-u userlist 显示有效用户ID在userlist列表中的进程
-F 显示更多额外输出(相对-f参数而言)
-O format 显示默认的输出列以及format列表指定的特定列
-M 显示进程的安全信息
-c 显示进程的额外调度器信息
-f 显示完整格式的输出
-j 显示任务信息
-l 显示长列表
-o format 仅显示由format指定的列
-y 不要显示进程标记(process flag,表明进程状态的标记)
-Z 显示安全标签(security context) 信息
-H 用层级格式来显示进程(树状,用来显示父进程)
-n namelist 定义了WCHAN列显示的值
-w 采用宽输出模式,不限宽度显示
-L 显示进程中的线程
-V 显示ps命令的版本号

使用 ps 命令的关键不在于记住所有可用的参数,而在于记住最有用的那些参数。,如果想查看系统上运行的所有进程,可用 -ef参数组合。

$ ps -ef 
UID        PID  PPID  C STIME TTY          TIME CMD 
root         1     0  0 11:29 ?        00:00:01 init [5] 
root         2     0  0 11:29 ?        00:00:00 [kthreadd] 
root         3     2  0 11:29 ?        00:00:00 [migration/0] 
root         4     2  0 11:29 ?        00:00:00 [ksoftirqd/0] 
root         5     2  0 11:29 ?        00:00:00 [watchdog/0] 
root         6     2  0 11:29 ?        00:00:00 [events/0] 
root         7     2  0 11:29 ?        00:00:00 [khelper] 
root        47     2  0 11:29 ?        00:00:00 [kblockd/0] 
root        48     2  0 11:29 ?        00:00:00 [kacpid] 

-e 参数指定显示所有运行在系统上的进程; -f 参数则扩展了输出,这些扩展的列包含了有用的信息。
 UID:启动这些进程的用户。
 PID:进程的进程ID。
 PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
 C:进程生命周期中的CPU利用率。
 STIME:进程启动时的系统时间。
 TTY:进程启动时的终端设备。
 TIME:运行进程需要的累计CPU时间。
 CMD:启动的程序名称。

如果想要获得更多的信息,可采用 -l 参数,它会产生一个长格式输出。

$ ps -l 
F S  UID PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY      TIME   CMD 
0 S  500 3081  3080  0  80   0 -  1173 wait pts/0   00:00:00 bash 
0 R  500 4463  3081  1  80   0 -  1116 -    pts/0   00:00:00 ps 
$ 

注意使用了 -l参数之后多出的那些列。
 F :内核分配给进程的系统标记。
 S :进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵
化,进程已结束但父进程已不存在;T代表停止)。
 PRI :进程的优先级(越大的数字代表越低的优先级)。
 NI :谦让度值用来参与决定优先级。
 ADDR :进程的内存地址。
 SZ :假如进程被换出,所需交换空间的大致大小。
 WCHAN :进程休眠的内核函数的地址。

2. BSD风格的ps命令参数

参 数 描 述
T 显示跟当前终端关联的所有进程
a 显示跟任意终端关联的所有进程
g 显示所有的进程,包括控制进程
r 仅显示运行中的进程
x 显示所有的进程,甚至包括未分配任何终端的进程
U userlist 显示归userlist列表中某用户ID所有的进程
p pidlist 显示PID在pidlist列表中的进程
t ttylist 显示所关联的终端在ttylist列表中的进程
| O format | 除了默认输出的列之外,还输出由format指定的列 |

|X | 按过去的Linux i386寄存器格式显示 |
|Z | 将安全信息添加到输出中 |
|j |显示任务信息 |
| l |采用长模式 |
|o format | 仅显示由format指定的列 |
| s |采用信号格式显示 |
| u | 采用基于用户的格式显示 |
|v |采用虚拟内存格式显示 |
|N namelist | 定义在WCHAN列中使用的值 |
|O order | 定义显示信息列的顺序 |
|S | 将数值信息从子进程加到父进程上,比如CPU和内存的使用情况 |
| c | 显示真实的命令名称(用以启动进程的程序名称) |
| e| 显示命令使用的环境变量 |
| f | 用分层格式来显示进程,表明哪些进程启动了哪些进程 |
| h| 不显示头信息 |
| k sort| 指定用以将输出排序的列 |
| n |和WCHAN信息一起显示出来,用数值来表示用户ID和组ID |
| w |为较宽屏幕显示宽输出 |
|H |将线程按进程来显示 |
|m |在进程后显示线程 |
|L| 列出所有格式指定符 |
|V |显示ps命令的版本号 |

在使用BSD参数时, ps 命令会自动改变输出以模仿BSD格式。下例是使用l 参数的输出:

$ ps l 
F  UID  PID PPID PRI  NI  VSZ  RSS WCHAN  STAT TTY      TIME COMMAND 
0  500 3081 3080  20   0 4692 1432 wait   Ss   pts/0    0:00 -bash 
0  500 5104 3081  20   0 4468  844 -      R+   pts/0    0:00 ps l 
$ 

注意,其中大部分的输出列跟使用Unix风格参数时的输出是一样的,只有一小部分不同。
 VSZ:进程在内存中的大小,以千字节(KB)为单位。
 RSS:进程在未换出时占用的物理内存。
 STAT:代表当前进程状态的双字符状态码。

第一个字符采用了和Unix风格 S 列相同的值,表明进程是在休眠、运行还是等待。第二个参数进一步说明进程的状态。
 < :该进程运行在高优先级上。
 N :该进程运行在低优先级上。
 L :该进程有页面锁定在内存中。
 s :该进程是控制进程。
 l :该进程是多线程的。
 + :该进程运行在前台。

3. GNU风格的ps命令参数

参 数 描 述
--deselect 显示所有进程,命令行中列出的进程
--Group grplist 显示组ID在grplist列表中的进程
--User userlist 显示用户ID在userlist列表中的进程
--group grplist 显示有效组ID在grplist列表中的进程
--pid pidlist 显示PID在pidlist列表中的进程
--ppid pidlist 显示父PID在pidlist列表中的进程
--sid sidlist 显示会话ID在sidlist列表中的进程
--tty ttylist 显示终端设备号在ttylist列表中的进程
--user userlist 显示有效用户ID在userlist列表中的进程
--format format 仅显示由format指定的列
--context 显示额外的安全信息
--cols n 将屏幕宽度设置为n列
--columns n 将屏幕宽度设置为n列
--cumulative 包含已停止的子进程的信息
--forest 用层级结构显示出进程和父进程之间的关系
--headers 在每页输出中都显示列的头
--no-headers 不显示列的头
--lines n 将屏幕高度设为n行
--rows n 将屏幕高度设为n排
--sort order 指定将输出按哪列排序
--width n 将屏幕宽度设为n列
--help 显示帮助信息
--info 显示调试信息
--version 显示ps命令的版本号

可以将GNU长参数和Unix或BSD风格的参数混用来定制输出。GNU长参数中一个着实让人喜爱的功能就是 --forest 参数。它会显示进程的层级信息,并用ASCII字符绘出可爱的图表。

1981 ?        00:00:00 sshd 
3078 ?        00:00:00  \_ sshd 
3080 ?        00:00:00      \_ sshd 
3081 pts/0    00:00:00          \_ bash 
16676 pts/0    00:00:00              \_ ps 

这种格式让跟踪子进程和父进程变得十分容易。