本网站相关文章:

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命令中的输出如上. 另外, 按照操作系统原理, 进程通常在以下
三种状态之间轮转:

  1. 运行态, 执行计算逻辑等
  2. 阻塞态, 被阻塞或者等待 IO 等
  3. 就绪态: 可运行, 但是因为其他进程而导致暂时中止

注意, 将进程正常运行状态同上面的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

  1. simple process selection, 不同于下面的格式输出, 这里表示要列出哪种进程, 不同选项决定打印数目
  • -e/-A: 显示所有终端下的所有进程, 所以-e的显示数据量远远高于-a, 但是搭配 x 那就完全不一样了
  • -a: 显示当前终端下所有程序, 注意, 仅仅打印当前终端
  • -x: 显示没有控制终端的进程信息, 比如守护进程
  • -m: 显示所有线程
  1. process selection by list. 用户, 用户组, 进程, 线程等限定条件下的过滤
1
2
3
-u <uid> or <username>: 当前用户的程序状况
-p <pid>: 显示特定进程
-g <gid> or <groupname>: 显示特定组

3.格式输出, 这仅仅决定了输出的纵向列, 不决定进程数量

1
2
3
-f: 输出所有的format信息: UID PID PPID C STIME TTY TIME CMD
-o <FOMAT>: 后面添加自定义的输出format信息
-j: JOBS 格式输出: USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND

Example

  1. 通用或常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 查看用户的所有进程(所有Unix)
ps -ax
ps aux
ps -axj

# 2. 标准方式: 列出进程并显示进程的关系
ps -ef

# 3. 打印进程树结构
ps -ejH
ps axms

# 3. 指定某一个用户的进程信息
ps -u bamboo
ps -U root -u root u

# 4. 非常重要,特别是在调试多线程时
# -L Show threads, possibly with LWP(轻量级线程) and NLWP(当前进程拥有的线程数目).
# -m Show threads after processes.
  1. 自定义输出: -o format选项添加自定义的输出类型信息, 该选项和u不能一起使用, 这里暂时做一些简单介绍
  • c 或者 cmd: 命令
  • g 或者 pgrp: 进程组 ID
  • j 或者 cutime: 用户进程累计运行时间
  • sess: session. 不管是 macos 还是 linux, 都具体看man ps文档, 里面有好多选项

注意, 各个format选项之间用逗号隔开, 不允许空格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 获取高CPU使用率线程, 按照cpu来进行排序. H表示显示层次关系. 该选项在macos中没有
ps H -eo user,pid,ppid,tid,start,time,%cpu,cmd --sort=%cpu
# macos中cmd名字叫comm, 不存在tid(终端 ID), 没有--sort命令
ps -eo user,pid,ppid,start,time,%cpu,comm

# 2. 查看摸一个进程的启动时间, lstart--启动时间,etime--运行时间
ps -p <pid> -o lstart,etime

# 3. 获取PID, PPID, CMD, TT, session, PGID
ps -o pid,ppid,pgid,sess,tt -ef |head -1; ps -o pid,ppid,pgid,sess,tt -ef|grep ttys005

# 4. 其他
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan
  1. macos 下特殊命令
1
2
# 1. 获取命令输出的最前面的几个输出
ps -ef|grep /dev/ttys005 | awk 'NR<=3'

不管是 linux 还是 macos, 如果想要获取”标题头”信息, 都是没办法的, 因为你一旦grep之后那就跟ps命令没啥
关系了, 再怎么想办法都没用, 此时需要使用取巧的办法. 执行两次命令.

1
2
3
4
5
# 1. 使用head. 然后后续再执行一遍ps命令(**)
ps -ef|head -1; ps -ef|grep /dev/ttys005

# 2. 在grep的时候显示头信息, 非常实用
ps -ef|head -1; ps -ef |grep bamboo
  1. 排查问题的重要命令
1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 获取当前按照占用内存排序的ps列表
ps aux --sort=+rss
ps aux --sort=-rss

# 2. 按照cpu排序
ps aux --sort=+%cpu
ps aux --sort=-%cpu

# 3. 获取占用内存最大的某几个进程
ps aux|sort -k 4 -rn|head

# 4. cpu
ps aux|sort -k 3 -rn|head

关于 sort 和 head 命令见下文说明, 其可以自定义输出的个数

pstree

输出说明

display a tree of processes, 该命令实际上可以被 htop 中的输出替换, 后者显示更加好看.

all process:

1
2
3
4
5
# init, getty分别为进程名称
init-+-getty
|-getty
|-getty
`-getty

Merge all process:

1
2
# 默认情况下, 合并所有相等名称的进程, 其中4表示进程的数量
init---4*[getty]

Thread and Process

1
2
3
进程: [process-name]
线程: {thread-name}
Example: icecast2---13*[{icecast2}]

Crossroad

关于 pstree 的十字输出, 其中从哪里产生”十字路口”, 就表示后续的都是该进程的”子孙”.

Output

1
2
3
4
5
6
7
8
9
# 9122, 9171等都是26577的子孙进程/线程.
# 5677, 5680是9047的子孙进程
PM2 v2.6.1: God(26577)─┬─gunicorn(9047)─┬─gunicorn(5677)
│ └─gunicorn(5680)
├─python(9122)
├─python(9171)
├─{PM2 v2.6.1: God}(26578)
├─{PM2 v2.6.1: God}(26776)
└─{PM2 v2.6.1: God}(26777)

Example

1
2
3
4
5
6
# 获取所有输出, 并默认合并
pstree
# 不合并所有进程
pstree -a
# 查看某一个进程以及子孙进程
pstree -p <pid>

进程命令

进程状态

使用/proc/<pid>/status来查看某一个进程的具体详细信息.

  • Pid:进程 ID
  • PPID:父进程 ID
  • Threads: 线程数量

查看进程和线程

Linux 下的命令:

1
2
3
4
# 获取线程详细信息, 见第一节内容
ps -efL | grep <app-name>
# 显示文件
ls /proc/PID/task | wc -l

OSX 下的命令:

1
2
3
# 获取进程的详细信息, 类似/proc/<pid>/status, 但是无法获取具体的TID
top -pid <pid>
# 利用活动监视器

sort 和 head

sort

  1. 命令参数说明
  • -b: 忽略行开始的空格字符
  • -n: 按照数值大小排序
  • -k 域: 指定列排序
  • -r: 反向排序
  • -t 分割符: 指定排序时所用的栏位分隔字符
  • -c: 检查文件是否已排序
  • -f: 将小写字母当成大写字母
  1. 使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 对文件内容进行排序并输出
sort need_check.txt
sort need_check.txt > output.txt

# 2. 逆序
sort -r need_check.txt

# 3. 基于第二列对文件进行排序, 其中-n表示对数值内容进行排序, -k2表示对第二列进行排序
sort -nk2 lsl.txt

# 4. 管道排序
ls -l / | sort -n -k5

# 5. 排序并删除重复行
sort -u need_check.txt
  1. 命令参数说明
  • -q: 隐藏文件名
  • -v: 显示文件名
  • -c 数目: 显示的字节数
  • -n 行数: 显示的行数, 这个最有用