进程相关命令
pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat,kill, pkill, job, bg, fg, nohup
pstree
进程树,来自 psmisc 软件包(fuser 和 killall 也来自 psmisc ) connecting.asciidoc
1 | pstree [OPTION] [ PID | USER ] |
ps
process state,默认显示当前终端中的进程,Linux 系统各进程的相关信息均保存在/proc/PID
目录下的各个文件中。ps 显示的是进程快照,如果要动态显示实时的进程信息,可以使用 top 命令
1 | ps [options] |
ps 的参数有非常多,三种风格都支持
大致分以下五类,这五类是我划分的,和 man 文档不太一样,下面是常见的 option:
简单选择范围
1
2
3a # 显示所有终端的进程
x # 显示不链接终端的进程
-e # 显示所有进程,和ax显示的进程一样多,但是不如ax显示的属性多按条件查询
查询条件之间用逗号分割1
2
3
4
5
6
7
8-p | p pidlist # 指定pid列表
--ppid pidlist # 显示属于pid的子进程
-C cmdlist # 指定命令列表
-u userlist # 指定 effective user 列表,可以写用户名或用户id
-U userlist # 指定 real user 列表
-g grplist # 指定effective group 列表,可以写组名或组id
-G grplist # 指定real group 列表
-t ttylist # 指定tty控制输出属性
1
2
3
4o 属性列表 # 指定属性,属性之间用逗号分割
u # 显示user,以及%cpu、%mem等信息,适合面向用户
-f # 显示UID、PPID、C与STIME
-F # 比-f多显示SZ、RSS、PSR格式化输出
1
2
3
4
5
6f # 显示进程树,相当于 --forest
k|--sort [+|-]key[,[+|-]key[,...]] # 按照属性排序,如果多个属性,用逗号分割,属性前加-表示倒序
-H # 显示进程层级格式,和 f 差不多
ps aux k %cpu 等于 ps aux --sort %cpu 等于 ps aux --sort=%cpu
ps aux k -%cpu 等于 ps aux --sort -%cpu 等于 ps aux --sort=-%cpu显示线程
1
-L # 显示线程
其他
1
-L # 显示所有属性,小写的那列是属性code,大写的是属性header,`ps | head -1`输出的就是header
很多 option 是冲突的,有的冲突会报错,有的结果无意义我也算它冲突,大概有以下两种情况:
按条件查询 和 简单选择范围:我们的预期是从指定的范围内按条件查询,然后输出查询的结果,有的命令确实是这个逻辑,但是 ps 会把所有的进程和查询到的进程都输出,这样的结果是没有意义的
控制输出的属性:当多个这种类型的 option 组合在一起,如果指定的属性列表是包含关系,则正常,否则报错,例如-f 和-F 会按照-F 输出结果,但是-f 和 u 就会报错。
简单选择范围 的 option 默认展示若干属性,它们和控制输出的属性不冲突
常用组合
常见属性
ps L
可以查看所有进程属性,有 170 个,我叫它属性,实际 man 文档称之为 SPECIFIERS(说明符),o 选项可以指定 ps 输出哪些进程属性,下面是常用的进程属性:
- user|euser:effective user,有效的用户
- ruser:real user 真正的用户,例如普通用户 lujinkai 使用 sudo 执行命令,那 effective user 就是 lujinkai,real user 就是 root
- fuser:
- suser:
- %cpu:cpu 占用率,精确到小数点后一位
- c:cpu 占有率,精确到个位数
- %mem:内存占有率
- pid:进程 id,如果是线程,则是线程所在进程的 id
- ppid:父进程 id
- lwp|spid|tid:线程 id
- s|state:minimal state display (one character)
- stat:multi-character process state
- ni|nice:nice 优先级
- pri:priority 优先级
- rtprio:rtprio 优先级
- sz:物理内存大小,包括文本、数据和堆栈空间
- psr:processor,CPU 编号,表示进程占用哪个 CPU 核心
- vsz:虚拟内存大小,单位 k
- rss:常驻内存大小,包括了共享库内存的大小(不同进程引用同一个库文件,那这些进程的 rss 中都包含了这个共享库的大小),单位 k
- comm:进程名,例如:
mysqld
- command:完整命令,例如:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir
- time|cputiime:进程占用 CPU 的累计时间
- lstart:开始时间
- etime:运行时间
- stime:启动进程的时间
进程状态码
1 | D # 睡眠状态,不可中断 (通常是IO) |
对于 BSD 风格,stat 还会显示下面的状态码:
1 | < # 高优先级(对其他用户不好) |
prtstat
查看进程详细信息,ps 适合查找进程,确定 pid,然后使用 prtstat 查看详细信息。
1 | prtstat [options] PID ... |
1 | [root@4710419222 ~]# prtstat 24954 |
设置和调整进程优先级
静态优先级:在创建进程时确定的,且在进程的整个运行期间保持不变,静态优先级的范围是 100 到 139
nice
进程默认启动时的 nice 值是 0,对应 的优先级是 120,只有根用户才能降低 nice 值
1 | nice [OPTION] [COMMAND [ARG]...] |
以指定的优先级来启动进程:
1 | [root@centos8 ~]#nice -n -10 ping 127.0.0.1 |
renice
调整正在执行中的进程的优先级
1 | [root@centos8 ~]#renice -n -20 2118 |
搜索进程
按条件搜索进程:
ps options | grep 'pattern'
最灵活- pgrep 按预定义的模式
- pidof 按确切的程序名称查看 pid
pgrep
顾名思义,过滤进程
1 | pgrep [options] <pattern> |
pidof
1 | pidof [options] [program [...]] |
1 | [root@centos8 ~]#pidof -x ping.sh |
uptime 和 w
uptime 显示:当前时间、系统启动时间、当前在线人数、系统负载(1、5、15 分钟的平均负载,一般不会超过 1,超过 5 时建议警报)
1 | [root@4710419222 ~]# uptime |
w 除了显示 uptime 显示的内容外,还可以在线人员的信息
1 | [root@4710419222 ~]# w |
mpstat
来自于 sysstat 包,显示 CPU 相关统计
1 | mpstat [options] [ interval [ count ] |
1 | lujinkai@Z510:~$ mpstat |
top
查看进程实时状态
htop
top 的升级版
cpu4 核 4 线程和 4 核 8 线程的区别:
1 | 4核 就是有4个物理核心,4线程 就是一个核心对应一个线程,8线程就是两个线程对应一个核心,是intel使用超线程技术,把一个物理核心模拟成两个逻辑核心。所以任务管理器或者htop会显示会显示出8张CPU表 |
关于 PR、NI、PRI:
1 | PR:priority 优先级,系统调节 |
1 | 1-8 # cpu每个核心负载 |
VIRT:进程占用的虚拟内存,这个虚拟内存和 swp 没有关系,是进程“需要的”虚拟内存大小,包括进程使用的库,代码,数据等。
假如进程申请 100m 的内存,但实际上只使用 了 10m,那么它会增长 100m,而不是实际的使用量
现代操作系统里面分配虚拟地址空间操作不同于分配物理内存。在 64 位操作系统上,可用的最大虚拟地址空间有 16EB,即大概 180 亿 GB。那么在一台只有 16G 的物理内存的机器上,我也能要求获得 4TB 的地址空间以备将来使用。例如:
1 | void *mem = mmap(0, 4ul * 1024ul * 1024ul * 1024ul * 1024ul, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); |
当使用 mmap 并设置 MAP_NORESERVE 标志时,并不会要求实际的物理内存和 swap 空间存在。所以上述代码可以在 top 中看到使用了 4096g 的 VIRT 虚拟内存,这当然是不可能的,它只是表示使用了 4096GB 的地址空间而已
一般来说不用太在意 VIRT 太高,因为你有 16EB 的空间可以使用
free
显示内存使用情况
1 | free [options] |
pmap
进程对应的内存映射
vmstat
虚拟内存信息
iostat
统计 CPU 和设备 IO 信息
dstat
系统资源统计
iotop
监视磁盘 I/O
iftop
显示网络带宽使用情况
iftop 和 nethogs
…
nload
查看网络实时吞吐量
glances
综合监控工具
lsof
查看进程打开文件
cockpit
CentOS8 新特性
kill
信号发送
作业管理
nohup
no hang up,不挂断的意思,如果当前 terminal 关闭了,命令就转为后台继续运行
nohup 和 & 的区别:
如果不是通过 exit 退出 terminal,而是点击 × 强行关闭 terminal,通过 & 进入后台的命令会被杀死,而通过 nohup 会将命令转后台继续运行,所以二者通常搭配一起使用
范例:
1 | [root@elk2-ljk bin]$nohup ./cerebro >/dev/null 2>&1 & |
screen
- 创建新会话:
screen -S <session-name>
- 加入会话:
screen -x <session-name>
- 退出并关闭会话:
exit
- 剥离当前会话:
ctrl + a,d
- 显示所有已经打开的会话:
screen -ls
- 恢复某会话:
screen -r <session-name>
关于 -x
和 -r
: -x 是加入会话,多个终端都可以加入,-r 是恢复会话,当一个终端恢复会话,其他终端就无法恢复,只能加入
1 | screen -S new |
tmux
Tmux 是一个终端复用器(terminal multiplexer),类似 screen,但是更易用,也更强大
tmux 好像不能共享会话
新建会话:
tmux new -s <session-name>
查看所有会话:
tmux ls
1
2
3
4[root@centos7 lujinkai]# tmux ls
jin: 1 windows (created Sat Jul 25 13:51:23 2020) [80x45] (attached) #当前所处的会话是jin
kai: 1 windows (created Sat Jul 25 13:51:34 2020) [80x45]
lu: 1 windows (created Sat Jul 25 13:49:33 2020) [80x45]退出会话:
exit
分离会话:ctrl + b d 或者
tmux detach
接入会话:
tmux attach -t <session-name>
用于重新接入某个已经存在的会话。切换会话:
tmux switch -t <session-name>
杀死会话:
tmux kill-session -t <session-name>