进程管理
1. 进程概述
触发任何一个事件时,系统都会将他定义为一个进程,并给与这个进程一个ID,称为PID,同时依据启发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设定
进程与引用程序的关系
应用程序表现为磁盘可执行文件,运行程序时,系统就会读取该文件到内存中,占用一定的空间,系统会分配一定的资源给他来进行执行,而放到内存中,这个正在执行的程序就成是进程- 进程是动态的概念,程序是静态的文件
- 一个程序可以开启多个进程
- 进程是有生命周期的
软件程序管理
内核创建第一个进程,称为初始进程CentOS6中叫init,CentOS7中叫systedmd。该进程可在系统上启动所有其他进程。内核每启动一个其他进程,都将在虚拟内存中为其分配一个唯一的空间,用于储存该进程使用的数据和代码- task struct:Linux内核存储进程信息的数据结构格式,包括元数据与程序数据
- task list:多个任务的task struct组成的链表
子进程与父进程
当我们执行一个程序,比如/bin/bash时,会取得一个具有PID号码的进程,当这个进程进行其他作业时,这些其他作业也会触发成一个具有PID号码的进程,这个后来产生的PID就是子进程,而原本的bash环境中,就称为父进程进程与线程
进程(precess):都由其父进程创建可能会调用函数,用fork()或者clone() 来实现,CoW(写时复制copy or write当一个进程创建时,系统内存中暂时不会分配空间,指向的还是父进程的内存空间,当子进程的内容发生修改时,才会复制父进程的内存空间,建立新的。),相当于一个整体的任务,要完成这个任务要相关的人员、资源的集合。进程之间除父子关系,不共享资源,彼此间是不影响的。
线程(thread) :{}就是进程需要的人员,一个进程最少有一个线程,可以多个。
在一个进程中的线程之间相互访问,资源是共享的。所以,有一个线程出问题,会互相影响其他线程。线程相对轻量化,占用的资源比进程少示例:实际应用中比较,web server 多人访问服务
第一种做法:由一个父进程生成多个子进程去响应远程客户端的请求,服务于用户,如果有100个用户就会生成100个子进程,占用资源多;优点是进程间互不影响,相对稳定
第二种做法:总进程开启若干子进程,由子进程开启若干线程,用户的请求由线程来提供服务,线程占用的资源较少;其中一个线程如果出问题,可能会影响其他线程,不稳定
时间片
一个cpu只能同时做一件事,有2个用户,就会将执行时间切成时间片,每个时间片很短,每个用户执行一个时间片,跳到另一个用户再执行一个,循环执行,因为时间片时间很短,所以用户不易分辨。由于来回执行程序,需要保存原来的状态,这个过程就叫做进程的上下文切换,会带来资源消耗
2. 进程的基本状态和转换
进程的基本状态
创建状态
进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态就绪状态
进程已准备好,已分配到所有资源,只要分配到CPU就能立即运行,类似队列,等待执行执行状态
进程处于就绪状态被调度后,进程进入执行状态,执行时间由时间片控制,当时间片用完,就会释放CPU回到就绪队列状态,整个任务结束后,就会释放CPU,退出阻塞状态
收到I/O请求,需要从磁盘读数据到内存,而进程暂时无法收到数据, 进程暂停运行,受到阻塞,在满足请求时进入就绪状态等待系统调用- PIO : 应用程序的输入输出
只要出现存储设备与内存数据之间的交换 都要经过CPU - DMA:内存的直接访问,
CPU发送读取指令到DMA后,就可以挂起或执行其他指令,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
- PIO : 应用程序的输入输出
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行
状态之间转换六种情况
运行→就绪
- 主要进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的
- 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
就绪→运行
运行的进程额时间片用完,调度就转到就绪队列中选择合适的进程分配CPU运行→阻塞
正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发了I/O请求阻塞→就绪
进程所等待的时间已经发生,就进入就绪队列以下两种状态是不可能发生的
- 阻塞→运行
即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取 - 就绪→阻塞
就绪状态根本就没有执行,谈不上进入阻塞态
- 阻塞→运行
3. 进程优先级
- 优先级分类
- 系统优先级:数字越小,优先级越高
0-139(centos4,5)
0-98,99(centos6) - 实时优先级:
99-0 值最大优先级最高 - nice值:
-20到19,对应系统优先级100-139或99
PS:centos6中nice值在99-99之间,
- 系统优先级:数字越小,优先级越高
- 队列优化
判断进程的优先级时,如果一个个去比较,是很费时间的,系统的解决方式为建立系统队列与等待队列
- 运行队列
根据优先级,分出140个运行队列,将同级别的进程放在一个队列中,cpu处理进程时,从高优先级依次执行 - 等待队列
在同一级别处理进程时,将超过时间片的进程放入等待队列,运行队列与等待队列来回切换,直到将次运行队列处理完。
- 运行队列
4. 进程内存
物理地址空间和线性地址空间
- 物理地址空间
一个应用程序运行,内存会分配一块空间,它实际占用的内存空间 - 线性地址空间
对应用程序而言,它认为所占用的是所有内存的空间,他会映射一个线性的虚拟空间,当应用程序运行时,希望从虚拟内存读数据,虚拟空间在实际内存中有映射关系
- 物理地址空间
Page Frame
页框,用存储页面数据,储存Page 4k ,类似于磁盘的块- LRU:
Least Recently Used近期最少使用算法,释放内存 分配内存使用的算法。将近期不用的数据,逐渐淘汰掉 - MMU
Memory Management Unit 负责转换线性和物理地址 - TLB
Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存
5. 进程之间通讯
IPC:Inter Process Communication
同一主机:signal:信号 命令kill –l 查看信号类型
- shm:shared memory 共享内存空间,将想要交换的数据放入共享内存,从共享内存中取就可以
- semaphore:信号量,信号量是一个非负整数,所有通过它的线程都会将该整数减一,当该整数值为零时,所有试图通过它的线程都将处于等待状态
不同主机:socket:IP和端口号
RPC:remote procedure call 应用层 远程过程调用,
MQ:消息队列,Kafka,ActiveMQ 应用层
6. 进程状态
- 进程执行效果分类:
- 守护进程:daemon,在系统引导过程中启动的进程,和终端无关的进程,不占用资源
- 前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
- 进程状态:
- 运行态:running
- 就绪态:ready
- 睡眠态:可以将来还原的
- 可中断:interruptable 人为干预,交互式
- 不可中断:uninterruptable 系统激活
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵死态:zombie,结束进程,父进程结束前,子进程不关闭。
7. 系统管理工具
Linux系统各进程的相关信息均保存在/proc/PID目录下的个文件中,文件中每个数字对应一个进程
7.1 pstree命令:
将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程
- 格式:pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
选项:
- p:显示线程
-V:显示版本信息
-a :显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c:不使用精简标示法。
-G:使用VT100终端机的列绘图字符。
-h:列出树状图时,特别标明执行的程序。
-l:采用长列格式显示树状图。
-n:用程序识别码排序。预设是以程序名称来排序。
-p:显示程序识别码。
-u:显示用户名称。
-U:使用UTF-8列绘图字符。
-V:显示版本信息。- 示例
1. 显示指定用户进程
$pstree -u v9
`
2. 显示进程间的关系
$pstree -apnh
7.2 PS命令
显示当前进程状态的快照,非动态跟踪
- 格式:
ps [OPTION]…
默认显示当前终端中的进程 支持三种选项:
UNIX选项
-C cmdlist指定命令的进程,多个命令用,分隔 -L 显示线程 -e 显示所有进程,相当于-A -f 显示完整格式程序信息 -F 显示更完整格式的进程信息 -H 以进程层级格式显示进程相关信息,父子关系 -u userlist指定有效的用户ID或名称EUID -U userlist指定真正的用户ID或名称RUID -G gid或groupname指定有效的gid或组名称 -g gid或groupname指定有效的gid或组名称 -p pid显示指pid的进程 -M 显示SELinux信息,相当于Z
BSD选项 如a
a 选项包括所有终端中的进程 x 选项包括不链接终端的进程,和终端无关的也会显示 u 选项显示进程所有者的信息 有UID权限时为生效的用户(euser),一般情况为程序发起者(ruser) f 选项已进程树显示,相当于 --forest k 属性对属性排序,属性前加- 表示倒序,在6中无效 o 属性...选项显示定制的信息pad、cmd、%cpu、%mem、euser L 显示支持的属性列表
GUN选项
--sort --ppid pid 显示属于pid的子进程
输出属性
在命令行执行ps -aux,输出结果如下:$ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.0 0.0 0 0 ? S 10:16 0:00 [kthreadd]
- %MEM:内存占用百分比
- %CPU:cup占用率
- VSZ:Virtual memory SiZE,虚拟内存集,线性内存
- RSS:ReSident Size,常驻内存集,物理实际使用内存数
- TTY:终端
- START:进程开启时间
- C:cup利用率,以整数表示
- COMMAND: 命令;[ ]中的进程表示该进程不活动,已经从内存换出到磁盘交换空间
- STAT:进程状态
- R:running
- sw:表示休眠并等待
- S:interruptable sleeping 可中断的休眠
- D:uninterruptable sleeping 不可中断的休眠
- T:stopped 停止态
- Z:zombie 僵尸态
- +::前台进程
- l:多线程进程
- L:内存分页并带锁
- N:低优先级进程
- <:高优先级进程
- s:session leader,会话(子进程)发起者
可定制信息,o选项,可通过L选项查看所有支持属性,常用有
- pri:priority优先级
- ni:nice值
psr:processor CPU编号
1:$taskset -p 8153 <==显示进程绑定的cpu pid 8153's current affinity mask: 1 <==表示在第1个cpu上运行,对应的绑定编号为0 2:$taskset -cp 1 8153 <==绑定进程在2号cpu上 3:$taskset -p 8153 pid 8153's current affinity mask: 2 <==表示在第2个cpu上运行
- comm:command指令
- rtprio:实时优先级
- %mem:内存占用率
- %cpu:cpu占用率
示例
例一:ps命令显示定制属性
$ps ao pid,cmd,psr,ni,pri,rtprio,ni
PID CMD PSR NI PRI RTPRIO NI
2192 bash 2 0 19 - 0
2618 -bash 5 0 19 - 0
例二:运行程序并指定nice优先级为10
$nice -n 10 sleep 100
例三:程序执行后,更改优先级
renice -n -10 2199
例四:查询某个命令的进程
$ps -C nano
PID TTY TIME CMD
8153 pts/1 00:00:00 nano
例五:以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程
ps -f --ppid 1234
例六:要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列:
ps -fL -C nginx
例七:查找指定进程名所有的所属PID,在编写需要懂std输出或文件读取PID的脚本时这个参数很有用:
ps -C httpd,sshd -o pid
7.3 搜索进程命令
7.3.1 命令pgrep
- 格式:
pgrep [options] pattern 支持正则表达式 选项:
-u : effective user,生效者
-U : real user,真正发起运行命令者
-t :与指定终端相关的进程
-l :显示进程名
-a:显示完整格式的进程名
-P:显示指定进程的子进程示例:模糊查找指令nano的进程编号
$pgrep -a ^nan*
1964 nautilus-desktop --force
8153 nano
7.3.2 命令pidof
可以显示进程名称对应的进程ID号
可以根据$?返回值,判断进程状态
- 格式:pidof [cmd]
- 示例
$pidof httpd
4210 4209 4208 4207 4206 3994
7.4 命令uptime
显示当前状态的静态指令
$uptime
20:53:34 | up 10:36, | 4 users, | load average: 0.00, 0.01, 0.05
当前时间 |系统运行时间|当前有多少用户|负载情况:1,5,10分钟平均值
- 系统平均负载
- 指在特定时间间隔内运行队列中的平均进程数
- 通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好
- 每个CPU内核的任务数大于5,那么次主机的性能有严重问题
- 如果是双核CPU,当Load Average为6时候说明机器已经被充分使用
7.5 命令top
动态监控系统状态 ,在命令行输入top,界面如下
- 格式:
top [选项] - 选项:
-p:指定进程
-b:全部显示所有进程
-H : 线程模式,示例:top -H -p 5155
-n#:刷新多少次后退出
-d#:指定刷新时间间隔,默认为3秒
#top
1. |top - 21:01:47 up 10:45, 4 users, load average: 0.04, 0.03, 0.05|
|uptime信息|
2. |Tasks: 259 total, | 1 running, |258 sleeping, | 0 stopped, | 0 zombie
| 总进程数 | 活动进程 | 睡眠进程 | 停止进程 | 僵尸进程|
3. |%Cpu(s): | 0.1 us, | 0.2 sy, | 0.0 ni, | 99.8 id,| 0.0 wa, | 0.0 hi, | 0.0 si, | 0.0 st|
| cpu状态 |用户占用比例|内核占用|改变过ni优先级的进程占用| 空闲占比 |等待IO时间| 硬中断 |软终端|丢失的时间片|
4. |KiB Mem : 1514076 total, | 76768 free, | 791284 used, | 646024 buff/cache|
| 总内存 | 剩余量 | 使用量 |用于缓存的量|
5. |KiB Swap: 3145724 total, | 3145724 free, | 0 used. | 503752 avail Mem |
| 虚拟内存总量 | 空闲量 | 使用量 |缓冲的交换区总量|
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
742 root 20 0 320060 6536 5072 S 0.3 0.4 0:49.45 vmtoolsd
- 首部信息显示隐藏开关
st:丢失的时间片,系统识别虚拟机,但不会识别虚拟机中运行的,cpu会分配给虚拟机中一些进程用,就会产生未知时间片
- uptime信息:开关 l
- tasks信息与cpu: 开关 t
- memory信息:开关 m
- cpu分别显示:(数字)1,将cpu核心分别显示处理
排序:
p:以占据的cpu百分比%cpu
M:占据内存百分比,%MEM
T:累计占据CPU时长,TIME+管理指令:
q:退出命令
S:修改刷新时间间隔
k:终止指定进程
W: 保存至root/.toprc
7.5.1 htop命令:EPEL源
与top命令相似,UI设计前卫一些
- 格式
htop [选项]
- 选项:
-d#:指定延迟时间
-u UserName:仅显示指定用户的进程
-s COLUME:以指定字段进行排序
- 子命令
s:跟踪选定进程系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某指定CPU核心
t:显示进程树
7.6 内存空间
7.6.1 命令free
内存空间使用状态
- 格式:free[OPTION]
选项
-b:以字节为单位
-m:以MB为单位
-g:以GB为单位
-h:易读模式buffers,解决速度不匹配问题;cache缓存,提高访问速度的
-t:显示RAM+swap的总和
-s n:刷新间隔为n秒
-c n:刷新n次后即退出执行结果
$free
total used free shared buffers cached
1:Mem: 1003020 887824 115196 4104 89252 428612
2:-/+ buffers/cache: 369960 633060
3:Swap: 2097148 1076 2096072
- 内存使用情况
- -/+ buffers/cach
(-buffers/cache) used内存数: used – buffers – cached
(+buffers/cache) free内存数 :free + buffers + cached - 虚拟内存信息
7.6.2 vmstat命令
虚拟内存信息
- 格式:vmstat [options][delay[count]]
- 选项:
-s:显示内存的统计数据 示例:
vmstat 1
动态观察,1秒刷新一次
vmstat 1 10
执行10次退出,1秒执行一次执行结果说明
vmstat -n
|procs| |-----------memory--------| |-swap-| -|---io---|-|system ||-------cpu-----|
1 2 3 4 5 6
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 107296 94720 442468 0 0 5 1 17 16 0 0 100 0 0
- procs:
r:可运行(正运行或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度) - memory:
swpd:交换内存的使用总量
free: 空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存容量 - swap
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s) - io:
bi:从块设备读入数据到系统的速率(kb/s)
bo:保存数据至块设备的速率 - system:
in:interrupts终端速率,包括时钟
cs:context switch 进程切换速率 - cpu:
us:运行非内核代码的时间
sy:运行内核代码的时间
id:空闲时间.Linux2.5.41前,包括IO-wait time
wa:I/O等待时间. 2.5.41前,包括in idle
st:丢失时间. 2.6.11前,unknown
7.6.2.1 命令iostat
与vmstat使用方法相似,统计CPU和设备IO信息
- 格式:iostat [选项] [-p [device…] [interval [count] ]
- 选项:
-c:仅显示CPU统计信息.与-d选项互斥.
-d:仅显示磁盘统计信息.与-c选项互斥.
-k:以K为单位显示每秒的磁盘请求数,默认单位块.
-p:device | ALL 与-x选项互斥,用于显示块设备及系统分区的统计信息.
-t:在输出数据时,打印搜集数据的时间.
-V:打印版本号和帮助信息.
-x :输出扩展信息. - 示例
1、监控设备adv1的扩展数据,每秒刷新一次,执行10次
iostat -x -d sda1 1 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda1 0.00 0.00 0.01 0.00 0.09 0.00 8.42 0.00 0.07 0.07 0.14 0.07 0.00
rrqm/s:每秒这个设备相关的读取请求有多少被合并了
rsec/s:每秒读取的扇区数
avgrq-sz:平均请求扇区的大小
avgqu-sz:是平均请求队列的长度,越短越好
await: I/O响应时间,一般低于5ms,await与svctm差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm: 表示平均每次设备I/O操作的服务时间
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
2、以k为单位显示磁盘使用情况,每2秒刷新一次
iostat -d -k 2
- 执行结果示例
iostat
1:Linux 2.6.32-754.el6.x86_64 (hai6) 09/06/2018 _x86_64_ (4 CPU)
2:avg-cpu: %user %nice %system %iowait %steal %idle
0.02 0.00 0.16 0.00 0.00 99.81
3:Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.01 0.03 0.00 1540 0
sda 0.46 19.71 2.57 1047842 136528
- 架构CPU信息
- CPU信息
- 块设备信息
1. tps: 每秒钟发送到的I/O请求数.
2. Blk_read /s: 每秒读取的block数.
3. Blk_wrtn/s: 每秒写入的block数.
4. Blk_read: 读入的block总数.
5. Blk_wrtn: 写入的block总数.
7.6.3 命令pmap
进程对应的内存映射,与文件/proc/PID(进程编号)/maps类似
- 格式
pmap [options] pid […]
- 选项
-x:显示详细格式的信息
- 执行示例
pmap -x 7795
7795: nano
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 168 112 0 r-x-- nano
0000000000629000 8 8 4 rw--- nano
0000000001fd9000 528 468 468 rw--- [ anon ]
... <==省略
cat /proc/7795/maps <==与pmap显示内容相似
- RSS:真正占用空间
- Dirty:脏数据,数据没有最终结束,处于中间状态
8. 系统监控工具
8.1 命令glances
EPEL源,可以跨网络监控
格式
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [–password] [-t refresh] [-f file][-o output]常用选项:
-b:以Byte为单位显示网卡数据速率
-d:关闭磁盘I/O模块
-f:/path/to/somefile:设定输入文件位置
-o{HTML|CSV}:输入格式
-m:禁用mount模块
-n:禁用网络模块
-t #:延迟时间间隔
-1:每个CPU的相关数据单独显示内建命令
a :按进程自动排序
l :显示或隐藏日志
c :按 CPU% 排序
b :Bytes or bits for network I/O
m :按 MEM% 排序
w :删除警告日志
p :按用户排序
x :删除警告和关键日志
i :按I/O使用状况排序
1 :轮流显示每个CPU内核的使用情况
d :显示隐藏磁盘读写状况
h :帮助信息
f :显示系统信息
t :View network I/O as combination
n :显示网络状态
u :View cumulative network I/O
s :显示传感器信息
q :离开程序
y : hddtemp统计信息C/S模式下运行glances命令,跨网络访问
- 服务器模式:
glances -s -B IPADDR
-s :表示以服务器端
-B:开启某一个监听地址,不加是所有网卡都参与
IPADDR:指明监听的本机那个地址 - 客户端模式:
glances -c IPADDR
-c 以客户端
IPADDR:要连入的服务器端地址,服务器指定的地址
- 服务器模式:
8.2 命令dstat
系统资源统计,代替vmstat,iostat
- 格式
dstat [-afv] [options..] [delay[count]]
选项
-c:显示cpu相关信息
-C: 当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息
-d :显示disk相关信息
-D: total,sda,sdb…
-g:显示page相关统计数据
-m:显示memory相关统计数据
-n:显示network相关统计数据
-p:显示process相关统计数据
-r:显示io请求相关统计数据
-s:显示swapped相关统计数据
-y:系统状态
- -socket:用来显示tcp udp端口状态
- -ipc:显示ipc消息队列,信号等信息
- -top-cpu:显示最占用CPU的进程
- -top-io:显示最占用io的进程
- -top-mem:显示最占用内存的进程
- -top-latency:显示延迟最大的进程
- -output :将状态信息以##.csv后缀定向到指定目录下。示例
在命令行输入dstat 2 10,默认选项为-cdngy
dstat 2 10
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
system:int、csw分别为系统的中断次数(interrupt)和上下文切换(context switch)
8.3 命令iotop
是一个用来监视磁盘I/O使用状况的top类工具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO
iotop输出
第一行:Read和Write速率总计
第二行:实际的Read和Write速率
第三行:参数如下:
线程ID
优先级
用户
磁盘读速率
swap交换百分比
IO等待所占的百分比
线程/进程命令
iotop常用参数
-o,–only只显示正在成I/O的进程或线程,除了传参,可以在运行过程总按o生效
-b,–batch非交互模式,一般用来记录日志
-n NUM,–iter=NUM设置监测的次数,默认无限。在非交互模式下很有用
-d SEC,–delay=SEC设置每次检测的间隔,默认1秒,接受非整型数据例如1.1
-p PID,–pid=PID指定检测的进程/线程
-u USER,–user=USER指定监测某个用户产生的I/O
-P –processes仅显示进程,默认iotop显示所有线程
-a,–accumulated显示累计的I/O,而不是带宽
-k,–kilobytes使用KB单位,而不是对人友好的单位,在非交互模式下,脚本编程有用
-t,–time加上时间戳,非交互非模式
-q,–quiet禁止头几行,非交互模式,有三种指定方式
-q 只在第一次监测时显示列名
-qq永远不显示列名
-qqq永远不显示I/O汇总
交互按键
left和right方向键:改变排序
r:反向排序
o:切换至选项–only
p:切换至–processes选项
a:切换至–accumulatd选项
q:退出
i:改变线程的优先级
8.5 命令lsof
list open files查看当前系统文件的工具,在Linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议(TCP)和用户数据协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符
格式
lsof [选项]选项
-a:列出打开文件存在的进程
-c :显示command列中包含指定字符的进程所打开的文件
-g:列出GID号进程详情
-d FD:列出占用该文件号的进程
+d /DIR/:列出目录下被打开的文件
+D /DIR/:递归列出目录下被打开的文件
-n目录:列出使用NFS的文件
-i条件:列出符合条件的进程(4、6、协议、:端口、@ip)
-p进程号:列出指定进程号所打开的文件
-u:列出UID号进程详情
-h:列出UID号进程详情
-v:显示版本信息
-n:不反向解析网络名字示例
查看由登录用户启动而非系统启动的进程
$tty /dev/pts/0 $lsof /dev/pts/0 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2189 root 0u CHR 136,0 0t0 3 /dev/pts/0 bash 2189 root 1u CHR 136,0 0t0 3 /dev/pts/0 bash 2189 root 2u CHR 136,0 0t0 3 /dev/pts/0
指定进程号,可以查看该进程打开的文件
$lsof -p 2189 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2189 root cwd DIR 8,3 4096 64 /data bash 2189 root mem REG 8,2 106070960 101092451 /usr/lib/locale/locale-archive ... <==省略部分内容 bash 2189 root 0u CHR 136,0 0t0 3 /dev/pts/0
通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:sshd等,也可以通过制定ip查看该ip的网络连接情况
lsof -i -n
lsof [email protected]
通过参数-i:端口,可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
lsof -i:80 -n
查看指定状态的网络连接
lsof -n -P -i TCP -s TCP:ESTABLISHED
-n:no host names, -p:no port names, -i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
恢复删除文件,此方法只适用于正在使用的文件
- 确定文件是在使用中
lsof /var/log/messages
- 删除文件
rm -f /var/log/messages
- 查看文件进程,拿到进程编号
lsof |grep /var/log/messages
- 进入对应进程下的fd文件
cd /proc/1027/fd/
- 查看文件列表,可以看到带有(deleted)的文件
$ll
lrwx------ 1 root root 64 Sep 6 14:15 3 -> socket:[28141]
l-wx------ 1 root root 64 Sep 6 14:15 4 -> /var/log/messages (deleted)
- 恢复文件
$cat /proc/1027/fd/4>/var/log/messages
$ls /var/log/messages
/var/log/messages <==已恢复
- 确定文件是在使用中
- 执行结果说明
$lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 744 rpc 8u IPv4 15285 0t0 TCP *:sunrpc (LISTEN)
rpcbind 744 rpc 11u IPv6 15288 0t0 TCP *:sunrpc (LISTEN
- COMMAND:进程的名称
- PID:进程标识符
- USER:进程所有者
- FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
- TYPE:文件类型,如DIR、REG等
- DEVICE:指定磁盘的名称
- SIZE:文件的大小
- NODE:索引节点(文件在磁盘上的标识)
- NAME:打开文件的确切名称
9 命令kill、pkill
9.1 kill
用来删除执行中的程序或工作,kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看
- 格式
kill [选项] [参数]
选项
-l :列出指定编号的信息,不指定则列出全部的信息名称
-n:指定信号,编号或名称都可以
-u:指定用户信号
- 介绍
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头,不区分大小写 - 查看
显示当前系统可用信号:kill -l, trap -l
常用信号:man 7 signal - 指定信号的方法
(1)信号的数字标识:1、2、9
(2)信号完整名称:SIGHUP
(3)信号的简写名称:HUP - 常用信号
- 介绍
编号 | 名称 | 作用 |
---|---|---|
1 | SIGHUP | 无须关闭进程而让其重读配置文件 |
2 | SIGINT | 终止正在运行的进程;相当于Ctrl+c| |
3 | SIGQUIT | 相当于ctrl+| |
9 | SIGKILL | 强制杀死正在运行的进程 |
15 | SIGTERM | 终止正在运行的进程 |
18 | SIGCONT | 继续运行 |
19 | SIGSTOP | 后台休眠 |
示例
终止程序nano
1: $ps -C nano <==找到对应PID PID TTY TIME CMD 4763 pts/0 00:00:00 nano 2:$kill -n 15 4812 <==终止进程
强制终止httpd服务
$echo $$ <==查看当前bash进程 2189 $kill 2189 <==尝试终止进程,没有终止 $kill -9 2189 <==使用9信号,强制终止
终止全部同名进程
$pidof httpd <==httpd有很多进程,也可以直接终止父进程 9919 9918 9917 9916 9915 9914 9913 9912 9909 $killall -15 httpd <==这里主要为说明killall用法
9.2 命令pkill
与pgrep用法相似,查找同时可以终止进程
- 格式:pkill [options] pattern
- 选项
-signal:发送信号给匹配到的进程
-u uid:effective user,生效者
-U uid:real user ,真正发起运行命令者
-t terminal:与指定终端相关的进程
-l:显示进程名(pgrep可用)
-a:显示完整格式的进程名(pgrep可用)
-P pid:显示指定进程的子进程 - 示例
- 删除所有以http开头的进程
pkill -9 "^http"
- 删除终端1的进程
$pkill -t pts/1 <==结束部分运行进程
$pkill -t pts/1 -9 <==连同终端一起关闭
- 删除所有以http开头的进程