【讲清楚,说明白!】进程管理

目录:
(一)了解进程的概念
(二)如何查看进程&&杀死进程
(三)把程序放置后台运行
(四)了解进程优先级
(五)调整进程优先级shell


(一)了解进程的概念
(1.1)在咱们系统后台中有比较多的概念,第一个“程序”,指的是使用某种语言开发出来的一段代码,是静态存放在咱们计算机硬盘上的program,它既不消耗CPU资源,也不消耗内存资源。第二个是“进程”,当一个程序运行的时候,在内存和CPU里会有体现,例如咱们计算机中运行的QQ、迅雷等应用程序,称之为process。第三个是“线程”,线程属于进程里的一个单元,一个进程里能够包含多个线程,这些线程会共享进程的内存空间。
(1.2)咱们知道系统中的每一个用户都有本身的ID号,简称UID,一样每一个进程页都有本身的ID号,process id简称PID。进程在运行的过程当中也可能会产生子进程,例如运行的A进程进过一段时间的运行后会产生一个B进程,此时咱们称A进程为父进程,称B进程为子进程,父进程可能生成一个子进程,也可能会杀死一个子进程,所以父进程和子进程之间是会通讯的,咱们把这种通讯称之为“信号”
【讲清楚,说明白!】进程管理缓存


(二)如何查看进程&&杀死进程
(2.1)pstree命令
(2.1.1)咱们首先来查看进程之间的父子关系,咱们可使用pstree命令,在vms002主机上它能够查询出系统中全部进程的父子关系,其中系统启动后全部进程的父进程是systemd,它的PID为1,而rhel6及之前的版本,全部系统的父进程是init。
【讲清楚,说明白!】进程管理
(2.1.2)pstree以树状图显示进程,只显示进程的名字,且相同进程合并显示,咱们还能以树状图显示进程,并显示进程PID
# pstree -p---以树状图显示进程,并显示进程PID
# pstree -p | more
【讲清楚,说明白!】进程管理
(2.2)父进程会按期的向子进程发送信号,那么系统中的信号有哪些呢?咱们可使用“# kill -l”命令列出系统中全部的信号列表,其中1)SIGHUP表示挂起,就是是重启,若是咱们想重启某个服务,可是不想改变其ID号,就可使用1号信号;其中2)SIGINT表示一般状况下,咱们使用“Ctrl+C”的方式终止进程的方式;而15)SIGTERM表示使用常规的方式终止进程,例如咱们使用kill命令不加任何参数终止某进程的时候,默认就是使用15号信号操做的,可是威力不够强,对于异常状态的进程是没法终止的;此时咱们使用9)SIGKILL信号,表示强制终止某进程,威力也比较强。
# kill -l---列出系统中全部的信号列表
# kill -2 29626---使用“Ctrl+C”的方式终止29626进程
【讲清楚,说明白!】进程管理
(2.3)杀死进程的方式
(2.3.1)若是咱们开启了一个进程,例如运行了一个firefox,咱们应该怎样查看进程的PID号呢?首先咱们可使用pgrep命令,而后直接加上程序名就能够查询出进程的PID号了(图2-3),而后使用kill命令将所查询的异常进程杀死就能够了。固然咱们也能够将两个步骤合并成一个步骤执行(图2-4)。
# pgrep firefox---查询firefox进程的PID号
# kill -9 $(pgrep firefox)---强制杀死firefox进程
# kill -9 pgrep firefox---强制杀死firefox进程
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(2.3.2)固然除了kill命令咱们也可使用killall命令,直接跟上程序名便可。
# killall firefox---杀死firefox进程
【讲清楚,说明白!】进程管理
(2.3.3)咱们也可使用pkill,其中pkill能够实现把系统中某用户踢出的功能。首先咱们使用jerry用户登陆到vms002主机(图2-5-1),此时咱们发现系统中是存在jerry用户登陆的,咱们使用pkill命令将jerry用户踢出(图2-5-2),此时咱们使用管理员删除jerry用户及其家目录的时候,即可以顺利的操做了(图2-5-3)。
# pkill -kill -t pts/1
# userdel -r jerry
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(2.4)查看进程咱们还可使用pidof命令,不过咱们发现pidof命令后须要跟具体的进程名称,若是进程名称查询时有不一致的地方都是没法查询出来,相比pgrep命令,pgrep可使用模糊查询的方式查询,所以更加高效。
# pidof firefox---查询firefox的进程号
【讲清楚,说明白!】进程管理
(2.5)ps列的选项及意义
(2.5.1)若是咱们但愿查询系统中全部的进程的状况,可使用ps命令,若是咱们只是使用ps命令的时候是只能查询当前终端里shell进程下本身的几个进程而已,并不能看到其余终端里的进程,也没法看到系统的后台进程。因此此时咱们但愿查询到系统中全部进程时,可使用以下两种方式查询:
# ps -ef---使用Linux风格的方式显示系统后台进程
# ps aux---使用Unix风格的方式显示系统后台进程
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(2.5.2)接着咱们来了解一下“# pa aux”命令中每一列表明的含义。
# ps aux | head---查询头10行的信息
USER:进程的属主
PID:进程的ID
PPID:父进程
%CPU:进程占用的CPU百分比
%MEM:占用内存的百分比
NI:进程的NICE值,数值大,表示较少占用CPU时间
VSZ:该进程使用的虚拟内存集(KB)
RSS:该进程占用的固定内存量(KB)(驻留中页的数量)
TTY:该进程在那个终端上运行(登录者的终端位置),若与终端无关,则显示(?)问号,若为pts/0等,则表示由网络链接主机进程
WCHAN:当前进程是否正在进行,若为“-”表示正在进行
START:该进程被触发启动时间
TIME:该进程实际使用CPU运行的时间
COMMAND:命令的名称和参数
(2.5.3)咱们来了解一下STAT状态这一列的相关含义。
D:不可中断的休眠状态(一般IO的进程)
R:正在运行中的队列中可执行的状态
S:处于休眠状态
T:中止或被追踪
W:进入内存交换(从内核2.6开始无效)
X:死掉的进程(基本不多见)
Z:僵尸进程
<:优先级较高的进程
N:优先级较低的进程
L:有些页被锁进内存
s:进程的领导者(在它之下有子进程)
l:多进程的(使用CLONE_THREAD,相似NPTL pthreads)
+:位于后台的进程组
【讲清楚,说明白!】进程管理
(2.6)ps命令的其它用法
(2.6.1)咱们可使用lscpu查询当前系统的cpu使用状况(图3-6),如今咱们系统中运行了一个应用程序firefox,咱们但愿查询这个程序具体是在当前系统的哪一个CPU上运行的,咱们可使用ps命令作以下的查询(图3-7)。
# lscpu
# ps mo pid,comm,psr $(pgrep firefox)---查询firefox进程及其线程运行在哪一个CPU上,psr表示运行在哪颗CPU
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(2.6.2)若是咱们想指定查询ps命令具体的哪几列的信息,则可使用以下的方式查询:
# ps -ex -o pid,%cpu,%mem | head---查询ps命令具体列的信息
【讲清楚,说明白!】进程管理bash


(三)把程序放置后台运行
(3.1)使用nohup
(3.1.1)当父进程关闭的时候,它所对应的子进程所有跟着关闭。咱们在vms002主机上首先打开一个firefox进程,使用pstree命令发现,firefox是运行在第三个终端bash之上的。
# pstree | grep -C2 firefox
# ps aux | grep -v grep | grep firefox
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(3.1.2)当咱们将第三个终端关闭以后,会发如今终端中建立的firefox应用程序也自动关闭了。
# ps aux | grep -v grep | grep firefox
【讲清楚,说明白!】进程管理
(3.1.3)可是不少时候咱们会经过远程链接的方式执行脚本,若是执行一个脚本须要10个小时,是不是说咱们须要将终端保持链接10个小时不关闭?所以为了解决这个问题,咱们须要将运行的进程放置到后台运行(图3-4),此时咱们发现关闭了全部的终端后firefox仍然可以正常的运行。
# nohup firefox &> /dev/null &---咱们建立一个firefox并放置到后台运行
# ps aux | grep -v grep | grep firefox---查询当前firefox的运行状态
# pstree | grep -C2 firefox---使用pstree查询firefox的运行状态
注意:grep -v grep表示的是反向过滤,不去搜索grep命令后包含的字段
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(3.2)使用jobs
(3.2.1)当咱们在vms002的终端直接运行一个firefox进程后,发现此时终端就没法再运行其余的命令了,此时咱们可使用键盘“Ctrl+Z”将firefox程序中止并放到后台。
【讲清楚,说明白!】进程管理
(3.2.2)若是咱们但愿查询在后台的程序状态信息,可使用jobs命令查看。若是咱们想将中止的firefox程序放在后台激活运行,可使用“# bg 1”命令。
# jobs---查询进程的状态
# bg 1---将1号jobs激活并放在后台运行
【讲清楚,说明白!】进程管理
(3.2.3)若是咱们但愿将后台运行程序调到前台来,则可使用“# fg 1”命令,若是咱们想终止运行的程序,则可使用“Ctrl+C”命令。若是咱们在运行程序的时候想直接运行在后台,则应该使用“# firefox &”这种方式便可,若是咱们想结束进程则可使用kill命令,其中1号jobs使用“%1”表示。
注意:虽然咱们将firefox放置到后台运行了,可是此时firefox仍然是在当前的终端上运行的,即若是当前终端关闭了那么此进程也会被关闭,这个要和nohup区分(图3-12)。
# fg 1---但愿将后台运行程序调到前台来运行
# firefox &---运行程序的时候想直接运行在后台
# kill -9 %1---结束进程
# ps aux | grep -v grep | grep firefox
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理网络


(四)了解进程优先级
(4.1)在咱们系统中全部的任务都是由CPU来完成的,在系统中若是一颗CPU有多颗核,那么咱们认为就是有多颗CPU。在计算机中咱们是能够一次性执行多个任务的,同时一颗CPU也是能够同时执行多个任务的。对于CPU来讲,是分为时间片执行的,例如如今系统中有多个任务,那么CPU会对每一个任务分片执行,假设每一个时间片的时长是1ms,由CPU轮询的在每一个任务之间循环执行,因为时间片循环的速度很是快,所以通常咱们在系统中操做的时候是感受不到有时间片在轮询的。有时候咱们会感受系统中某些任务是很是重要的,须要CPU优先执行,此时咱们是能够在系统中调整进程的优先级的。优先级的组成以下(图4-1),通常来讲,使用chrt命令能够修改优先系数,不过通常不建议修改(图4-2),而nice值的范围是“-20~19”之间,nice值越小优先级越高,nice值越大优先级越低。咱们在图形化界面中能够调整进程的优先级的,咱们选择“应用程序”--“系统工具”--“系统监视器”,而后即可以在图形化界面中修改进程的优先级了。
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(4.2)若是咱们的系统如今有两个进程,同时有两颗CPU,若是一个CPU上单独运行一个进程,那么对这两个进程设置进程优先级是没有意义的,可是咱们但愿能出现抢占资源这种状况,所以咱们须要把两个进程放到一颗CPU上去运行。咱们想要实现这样的效果,通常能够采用两种方式,第一种是关闭掉其中的一颗CPU,第二种方式是配置CPU的亲和性。ide


(五)调整进程优先级
(5.1)当前系统咱们有两颗CPU,首先咱们经过关闭其中的一颗CPU的方式来实现进程对资源抢占的效果,咱们在vms002主机上进入到/sys/devices/system/cpu/cpu1目录下,发现online的值为1,表示正在启用的状态,咱们能够将online的值设置为0,此时表示1号CPU处于关闭的状态(图5-2),咱们发现系统中确实此时只有0号CPU在运行(图5-3)。
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(5.2)top命令每一行的含义
(5.2.1)接着咱们在vms002主机上执行两个cat命令,实现不断消耗内存的效果(图5-4)。而后咱们使用top命令查询当前系统全部进程的状况,再按键盘1能够显示全部CPU运行的信息,其中第一行“top - 18:01:29 up 11:52, 6 users, load average: 2.72, 2.11, 1.11”分别表明的是当前的时间是18:01:29,机器一共运行了11:52的时长,当前系统有6 users个用户登陆,机器在一分钟、五分钟、十五分钟的负载分别是“2.72, 2.11, 1.11”。第二行“Tasks: 475 total, 7 running, 468 sleeping, 0 stopped, 0 zombie”表示的是系统总共有进程475 total,其中7 running在运行,有468 sleeping在睡眠状态,有0 stopped个是中止的,有0 zombie时僵尸的状态。因为咱们将1号CPU关闭了,因此此时2个进程都是在0号CPU上抢占式运行(图5-5)。第三行“%Cpu(s): 20.4 us, 79.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st”表示的是系统用户进程使用CPU百分比为20.4 us,内核中的进程占用CPU百分比为79.6 sy,用户进程空间内改变过优先级的进程占用CPU百分比为0.0 ni,空闲CPU百分比为0.0 id,CPU等待I/O完成的时间总量为0.0 wa(若是wa占用较多CPU,缘由是磁盘性能有问题,建议更换磁盘),硬件中断占用CPU百分比为0.0 hi,软件中断占用CPU百分比为0.0 si,被虚拟内存偷走占用CPU百分比为0.0 st。
注意:htop命令也能够实现top命令的相关显示,不过须要咱们额外的安装相关的软件包
# cat /dev/zero > /dev/null &
# top -d 1---每1秒中更新一次全部进程的显示
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(5.2.2)经验:
0.0 hi:硬中断,占的CPU百分比。硬中断是由硬件产生的,好比,像磁盘、网卡、键盘、时钟等。每一个设备或设备集都有它本身的IRQ(中断请求)。基于IRQ,CPU能够将相应的请求分发到对应的硬件驱动上(注:硬件驱动一般是内核中的一个子程序,而不是一个独立的进程)hi->Hardware IRQ:The amount of time the CPU has been servicing hardware interrupts
0.0 si:软中断,占的CPU百分比。一般软中断是一些对I/O的请求。这些请求会调用内核中能够调度I/O发生的程序。对于某些设备,I/O请求须要被当即处理,而磁盘I/O请求一般能够排队而且能够稍后处理。根据I/O模型的不一样,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另外一个进程去运行。I/O能够在进程之间产生而且调度过程一般和磁盘I/O的方式是相同的。Si->Software Interrupts:The amount of time the CPUhas been servicing software interrupts。
0.0 st:虚拟机偷取物理CPU的时间。好比:物理机已经运行了KVM,KVM虚拟机占用物理机的CPU时间。
(5.2.3)第四行中“Mem : 4033636 total”表示物理内存总量,“3265760 free”表示空闲内存总量,“380604 used”表示使用的物理内存总量,“387272 buff/cache”表示用做内核缓存的内存量和free -k是一个意思。第五行中“Swap: 6291448 total”表示交换区总量,“6291448 free”表示空闲交换分区总量,“0 used”表示使用的交换区总量,“3394360 avail Mem”表示总的可利用内存是多少。
【讲清楚,说明白!】进程管理
(5.2.4)第六行中PID表示进程id,USER表示进程全部者的用户名,PR表示由内核动态调整的优先级、用户不能修改,NI表示进程优先级即nice值、负值表示高优先级、正值表示低优先级、用户能够本身调整,VIRT表示虚拟内存、是进程正在使用的全部内存,RES表示的是常驻内存集(resident memory usage),SHR表示的是共享内存大小(shared memory)单位kb,S表示进程状态、其中D(不可中断的睡眠状态)、R(运行中或可运行)、S(睡眠中)、T(已跟踪/已中止)、Z(僵死),%CPU表示上次更新到如今的CPU时间占用百分比,%MEM表示进程使用的物理内存百分比,TIME+表示使用的CPU时间总计、单位1/100秒,COMMAND表示命令行。
注意:对于SHR:一、除了M自身进程的共享内存,也包括其余进程的共享内存;二、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;三、计算某个进程所占的物理内存大小公式为RES-SHR;四、swap out后,它将会降下来
【讲清楚,说明白!】进程管理
(5.2.5)对于top快捷键:
默认3s刷新一次,按s键刷新时间
按空格:当即刷新
q:退出
P:按CPU排序(CPU进行排序)
M:按内存排序
T:按时间排序
数字键1:显示每一个内核的CPU使用率
u/U:指定显示的用户
h:帮助
# top -p 9465---使用top命令动态只查看某个或某些进程的信息
【讲清楚,说明白!】进程管理
(5.3)此时咱们在图5-5中发现两个cat进程的NICE值都是0是一致的,而咱们但愿将进程11239的进程优先级提升,咱们可使用renice命令。咱们发现11239进程的nice值为-19,CPU的占用率为96.1%,而11232的nice值为0,CPU的占用率只有1.9%,所以咱们经过设置nice值而实现了进程抢占资源的效果,最后咱们使用killall命令终止cat命令的总线。
# renice -n -19 11239---将11239进程的nice值设置为-19
# killall -7 cat---终止cat命令的总线
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(5.4)调整进程优先级
(5.4.1)接着咱们将1号CPU开启,实现1号CPU和0号CPU都是启用的状态(图5-8),并从新运行两个cat命令,实现不断消耗内存的效果(图5-9),此时咱们发现两个进程是分别在两个CPU上运行的(图5-10)。
# echo 1 > cpu1/online
# cat /dev/zero > /dev/null &
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(5.4.2)固然如今咱们想具体的知道每一个进程到底是在哪一个CPU上运行的,咱们可使用ps命令,此时咱们发现13884进程是在0号CPU上运行,13899是在1号CPU上运行的。
# ps mo pid,comm,psr `pgrep cat`
【讲清楚,说明白!】进程管理
(5.4.3)如今咱们但愿在两颗CPU都是启用的状态下,仍然可以指定进程全部的进程都在同一颗CPU上运行,咱们可使用taskset命令进行指定(图5-12),此时咱们发现两个进程都已经在同一个CPU上运行了,且各占0号CPU运行的50%的容量(图5-13)。
# taskset -c 0 cat /dev/zero > /dev/null &---指定一个cat进程在0号CPU上运行
# ps mo pid,comm,psr pgrep cat---查询进程是在哪颗CPU上运行
# top -d 1---使用top命令而且每1秒更新一次
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理
(5.5)咱们在调整优先级的时候,都是修改已经运行了的进程的优先级,那么咱们是否能够以某优先级来运行某程序呢?其实这个是能够的,咱们使用nice指定进程的优先级为-10,而后开始运行一个cat循环的命令(图5-14)。咱们使用top命令后发现建立的-10的nice值的进程已经运行了(图5-15)。
# nice -n -10 taskset -c 1 cat /dev/zero > /dev/null &---咱们使用nice指定进程的优先级为-10,而后开始运行一个cat循环的命令
# top -d 1
【讲清楚,说明白!】进程管理
【讲清楚,说明白!】进程管理函数

—————— 本文至此结束,感谢阅读 ——————工具