内核和系统:ps, pstree介绍
本网站相关文章:
- 内核和系统(1)-cpu 术语和知识点
- 内核和系统(2)-cpu 架构体系
- 内核和系统(3)-IO 相关术语
- 内核和系统(4)-IO 模型
- 内核和系统(5)-磁盘分区
- 内核和系统(6)-缓存
- 内核和系统(7)-内存相关术语
- 内核和系统(8)-pstree 命令
ps
Status Code
ps, process status, 其相比 top 命令更加直接, 不过后者是动态的. 下面是 ps 命令显示的进程可能 status 信息
- D(磁盘睡眠状态, disk sleep): 不可中断睡眠, 不可以被唤醒, 常常在磁盘写入时
- R(running): 运行中, 也可能在运行队列中
- S(sleeping): 浅层睡眠, 进程在等待事件完成, 可以被唤醒
- T(stopped): 进程收到 SIGSTOP,SIGSTP,SIGTIN,SIGTOU 信号后停止运行, 可以发送 SIGCONT 来重新运行
- Z(zombie): 僵尸进程,defunct
在 Linux 中, 进程的 5 中状态在ps
命令中的输出如上. 另外, 按照操作系统
原理, 进程通常在以下
三种状态之间轮转:
- 运行态, 执行计算逻辑等
- 阻塞态, 被阻塞或者等待 IO 等
- 就绪态: 可运行, 但是因为其他进程而导致暂时中止
注意, 将进程正常运行状态同上面的STAT
区分开来.
关于T
状态, 可以看笔记进程会话中的终端作业控制例子.
Output
各类输出信息常见的:
- CPU——使用率
- VSZ——进程使用的虚拟内存
- RSS——当前进程常驻内存的大小
- STAT——进程状态,见 1)中的说明
- TTY——登录终端
- STIME–进程的启动时间(根据当前时间-启动时间 == 进程启动的总时间, 并非 CPU 时间)
- TIME——进程使用的总 CPU 时间(程序启动后,占用 CPU 计算所有的时间绝对值,累加的概念,该值与占用时间无关)
- COMMAND——命令
进程,进程组等信息:
- UID: 用户 ID
- PID: 进程 ID
- PPID: 父进程 ID
- PGID: 进程组 ID, 一般而言, 进程组 ID 就是进程组 leader 的 PID
Options
- simple process selection, 不同于下面的格式输出, 这里表示要列出哪种进程, 不同选项决定打印数目
-e/-A
: 显示所有终端下的所有进程, 所以-e
的显示数据量远远高于-a
, 但是搭配 x 那就完全不一样了-a
: 显示当前终端下所有程序, 注意, 仅仅打印当前终端-x
: 显示没有控制终端的进程信息, 比如守护进程-m
: 显示所有线程
- process selection by list. 用户, 用户组, 进程, 线程等限定条件下的过滤
1 | -u <uid> or <username>: 当前用户的程序状况 |
3.格式输出, 这仅仅决定了输出的纵向列, 不决定进程数量
1 | -f: 输出所有的format信息: UID PID PPID C STIME TTY TIME CMD |
Example
- 通用或常用命令
1 | # 1. 查看用户的所有进程(所有Unix) |
- 自定义输出:
-o format
选项添加自定义的输出类型信息, 该选项和u
不能一起使用, 这里暂时做一些简单介绍
- c 或者 cmd: 命令
- g 或者 pgrp: 进程组 ID
- j 或者 cutime: 用户进程累计运行时间
- sess: session. 不管是 macos 还是 linux, 都具体看
man ps
文档, 里面有好多选项
注意, 各个format
选项之间用逗号隔开, 不允许空格
1 | # 1. 获取高CPU使用率线程, 按照cpu来进行排序. H表示显示层次关系. 该选项在macos中没有 |
- macos 下特殊命令
1 | # 1. 获取命令输出的最前面的几个输出 |
不管是 linux 还是 macos, 如果想要获取”标题头”信息, 都是没办法的, 因为你一旦grep
之后那就跟ps
命令没啥
关系了, 再怎么想办法都没用, 此时需要使用取巧的办法. 执行两次命令.
1 | # 1. 使用head. 然后后续再执行一遍ps命令(**) |
- 排查问题的重要命令
1 | # 1. 获取当前按照占用内存排序的ps列表 |
关于 sort 和 head 命令见下文说明, 其可以自定义输出的个数
pstree
输出说明
display a tree of processes, 该命令实际上可以被 htop 中的输出替换, 后者显示更加好看.
all process:
1 | # init, getty分别为进程名称 |
Merge all process:
1 | # 默认情况下, 合并所有相等名称的进程, 其中4表示进程的数量 |
Thread and Process
1 | 进程: [process-name] |
Crossroad
关于 pstree 的十字输出, 其中从哪里产生”十字路口”, 就表示后续的都是该进程的”子孙”.
Output
1 | # 9122, 9171等都是26577的子孙进程/线程. |
Example
1 | # 获取所有输出, 并默认合并 |
进程命令
进程状态
使用/proc/<pid>/status
来查看某一个进程的具体详细信息.
- Pid:进程 ID
- PPID:父进程 ID
- Threads: 线程数量
查看进程和线程
Linux 下的命令:
1 | # 获取线程详细信息, 见第一节内容 |
OSX 下的命令:
1 | # 获取进程的详细信息, 类似/proc/<pid>/status, 但是无法获取具体的TID |
sort 和 head
sort
- 命令参数说明
-b
: 忽略行开始的空格字符-n
: 按照数值大小排序-k 域
: 指定列排序-r
: 反向排序-t 分割符
: 指定排序时所用的栏位分隔字符-c
: 检查文件是否已排序-f
: 将小写字母当成大写字母
- 使用示例
1 | # 1. 对文件内容进行排序并输出 |
head
- 命令参数说明
-q
: 隐藏文件名-v
: 显示文件名-c 数目
: 显示的字节数-n 行数
: 显示的行数, 这个最有用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 狂想写作本!
评论