linux ps 简书,史上最全ps 命令解析

进程状态

https://www.cnblogs.com/diegodu/p/9167671.html

Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。

与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。

在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。

进程占用内存

在讲解ps命令的参数之前,有必要先介绍一下Linux对进程占用内存的计算依据。因为Linux中的进程是使用虚拟地址的,这些进程通过malloc()或者mmap()向内存申请内存之后(这部分内存大小称为VSS - Virtual Set Size),内核并不会立刻为其分配实际的物理内存。等到进程真正使用到内存时(比如调用了memset()函数),内核才会为这个进程分配物理内存,并建立虚拟地址和物理地址之间的映射(参考这篇文章)。

SYSV 风格选项 - A 到 - Z 和 - a 到 - z 共 52 个,BSD 风格选项 A 到 Z 和 a 到 z 共 52 个。于是 ps 命令就有一共 104 个命令选项可能性。

4b19970a8f37

ps.jpg

在这 104 个命令选项中,未启用的或曾经使用过现在废弃的命令选项有如下 40 个,分别是 A、B、C、D、E、F、G、I、J、K、P、Q、R、W、Y、b、d、i、y、z、-B、-D、-E、-I、-J、-K、-Q、-R、-S、-W、-X、-Y、-b、-h、-i、-k、-r、-v、-x 和 - z。

输出是不同的

[root@node1 ~]# ps aux | wc -l

125

[root@node1 ~]# ps | wc -l

4

[root@node1 ~]#

常用

Linux ps 命令显示所有进程信息的选项只有 2 个,即 SYSV 风格的 - e 和 - A。相比之下,-e 更容易记忆和书写,请大家牢记这个 - e 选项。

大家知道,ps 命令的所有信息都是 linux kernel 生成,并通过 / proc / 目录输出给用户空间的。在 / proc / 目录下,每一个以数字开头的目录,就对应一个进程信息。既然如此,通过如下命令便可一目了然。

ps -e | wc -l && ps -A | wc -l&& ls /proc/ | grep '^[1-9]' | wc -l

证明 参数 - e 和 - A 显示的进程记录数确实和 proc 目录下的所有进程目录数一致。

#树形排序( 进程之间的关系)

f 和 - H 就是实现这个树形排序功能的 2 个选项。

#排序

选项 k 可以让我们以某个字段为条件对输出结果进行排序,并且还可以使用 +- 符号设置升序排序还是降序排序

ps -e u k rss

ps -e u k -rss

ps -e k ppid,rss -o pid,ppid,rss,ucmd

先按 ppid 进行升序排序,ppid 值相同时,再按 rss 值进行升序排序。

#进程数

ps -eL h| wc -l

#线程信息

ls /proc/6270/task/

Linux ps 同样提供了一组选项可以将每个进程的线程信息详细展现,这组选项包括 H、-L、-T、M、m 和 - m。在讲解这些选项之前,我们先看一个小测试。

ps -C mysqld -L #查看mysql 线程

第一行 PID 等于 LWP(线程 ID)的值,说明是线程组的主线程(即进程)。其余三个线程 ID 各不相同,但 PID 值都和主线程的 PID 值一样,说明是同一线程组的普通线程。

ps -C mysqld -m O lwp #同样和上一个命令

#ps 一共有多少显示项目

ps L | wc -l

Linux ps 命令的 aux 选项组合输出 PID、%CPU、%MEM、RSS、TIME 等数据项,ps 命令的 - el 选项组合输出 PID、PPID、WCHAN、TIME、CMD 等数据项。首先一个问题就是,ps 命令一共有多少数据项可以输出。这个问题很好回答,通过 L 选项很容易获取,一共有 168 个数据输出项。

其次的一个问题就是,是什么决定了 ps aux 命令输出结果中恰恰包含 USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START、TIME 和 COMMAND 这 11 个数据项呢。原因是 ps 命令中有一些选项用来对数据字段进行固定组合的作用。其中 aux 中的 u 选项就固定包含了以上 11 个数据输出项,并且他们的显示顺序也已经固化在代码中。

参数为

BSD 风格时,默认都会显示 PID、TTY、STAT、TIME 和 COMMAND 这 5 个字段。

参数为 SYSV 风格时,默认都会显示 PID、TTY、TIME 和 CMD 这 4 个字段。

ps 命令无参数时默认为 SYSV 风格。

ps -o %p,%P,%n,%a,%x,%t

PID, PPID, NI,COMMAND , TIME, ELAPSED

456, 454, 0,-bash ,00:00:01, 06:20:28

22945, 456, 0,ps -o %p,%P,%n,%a,%x,%t ,00:00:00, 00:00

[root@node1 ~]# ps -o "%p|%P|%n|%a|%x|%t"

PID| PPID| NI|COMMAND | TIME| ELAPSED

456| 454| 0|-bash |00:00:01| 06:21:14

22990| 456| 0|ps -o %p|%P|%n|%a|%x|%t |00:00:00| 00:00

使用 w 或 - w 选项,就会将完整的进程命令信息显示,多出的部分换行显示。有的时候为了效果好一点,建议我们可以多使用几次 w 选项,比如 ww、www 或 wwww。

选项 u 的 COMMAND 字段,默认会输出进程路径和执行参数信息。从上面的例子可以看出,选项 c 可以使选项 u 的 COMMAND 字段更加精简,只保留进程名称。选项 e 可以使选项 u 的 COMMAND 字段更加丰富,增加进程环境变量的相关内容。

[root@node1 ~]# ps u c

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 456 0.0 0.2 116456 3136 pts/0 Ss 10:45 0:01 bash

root 2163 0.0 0.2 116232 2604 pts/1 Ss+ 11:13 0:00 bash

root 6079 0.0 0.0 110104 796 tty1 Ss+ 3月21 0:00 agetty

root 23201 0.0 0.1 155360 1824 pts/0 R+ 17:10 0:00 ps

[root@node1 ~]# ps u e ww

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 456 0.0 0.2 116456 3136 pts/0 Ss 10:45 0:01 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin MAIL=/var/mail/root SHELL=/bin/bash SSH_CLIENT=192.168.174.1 1969 22 SSH_CONNECTION=192.168.174.1 1969 192.168.174.202 22 SSH_TTY=/dev/pts/0 TERM=vt100 XDG_SESSION_ID=149 XDG_RUNTIME_DIR=/run/user/0

root 2163 0.0 0.2 116232 2604 pts/1 Ss+ 11:13 0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin MAIL=/var/mail/root SHELL=/bin/bash SSH_CLIENT=192.168.174.1 1969 22 SSH_CONNECTION=192.168.174.1 1969 192.168.174.202 22 SSH_TTY=/dev/pts/1 TERM=vt100 XDG_SESSION_ID=149 XDG_RUNTIME_DIR=/run/user/0

root 6079 0.0 0.0 110104 796 tty1 Ss+ 3月21 0:00 /sbin/agetty --noclear tty1 linux LANG= PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin TERM=linux LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

root 23209 0.0 0.1 155360 1832 pts/0 R+ 17:10 0:00 ps u e ww XDG_SESSION_ID=149 HOSTNAME=node1 TERM=vt100 SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.174.1 1969 22 SSH_TTY=/dev/pts/0 USER=root etcd=/usr/local/kubernetes/bin LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: MAIL=/var/spool/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/kubernetes/bin:/root/bin PWD=/root LANG=zh_CN.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share SSH_CONNECTION=192.168.174.1 1969 192.168.174.202 22 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/ps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值