一、概念
1、内核对CPU指令的划分
首先复习以前学到的计算机的体系架构,从下到上,依次分别是:硬件、内核、系统调用、库、库调用、应用程序。其中应用程序有基于库接口开发的,也有基于系统调用接口开发的,还有两种接口都使用的,如下图所示:
内核把cpu的指令分为环3和环0(环0上的指令用于调用硬件资源),环3的指令任何人都可以使用,而环0的指令只能由内核调用。一个程序的指令不可能只使用环3的指令还需要使用环0的指令,环3的指令可以直接在cpu上运行,而环0上的指令只能由程序请求内核帮忙完成,自己不能直接调用环0的指令。如果在一个程序有很多指令都要用到环0的话那么其效率一定不会高,一个好的程序使用内核空间的指令与用户空间的指令是有一定的比例的,由用户空间的代码转换成内核空间的代码需要向内核请求调用,这个请求调用的过程是需要时间,真正产生生产力的用户空间的代码。
内核的指令与虚拟化也有很大的关系,我们后面会专门拿出一篇文章来介绍内核对cpu指令的划分与虚拟化的关系。
2、进程的生命周期
进程fork自身产生子进程,把要完成的任务交给子进程,进程本身会进入到sleeping状态等待子进程返回结果,那么下面就是子进程的表现时间了,当子进程把父进程交给他的任务执行完毕会向父进程发送一个exit信号,告知父进程自己已经把任务完成并且结果提交给父进程,当子进程把任务的结果提交给父进程之后,就会自杀(其实自己就已经释放了自己的地址空间,因为任务已经完成了),子进程自杀之后有一件事子进程没办法自己完成,就是注销身份证(PID)的过程,因为PID是父进程给他申请的(此时的状态是zonbie)。父进程会被exit信号给唤醒然后继续运行并把子进程给杀死(注销掉子进程的PID),如果父进程在子进程之前死了话,那么了进程就也会变成zombie状态并并移交给init进程处理。
我们的系统上可以同时运行那么多的进程是由谁进行管理的呢?是由内核进行管理的,进程管理是内核一个必要和重要的功能,此外还有网络管理,TCP/IP协议栈是集成在内核当中的,为什么要集成在内核当中?网络通信是一个很多程序都会用到的功能而且需要与硬件打交道,如果把TCP/IP协议栈放到用户空间的话效率太低。
3、子进程
为什么要创建子进程?在讨论进程管理之前我们要明确为什么要创建一个子进程,当一个进程面对一个比较复杂的任务的时候就会在原来进程基础上创建一个新的进程,把这个复杂的程序委托子进程完成,当子进程把委托给给它的的任务完成之后会把结果返回到父进程。
进程是如何创建的?内核并不负责进程的创建,内核在cpu上运行起来掌管了一切之后,意味着内核空间启动,开始创建第一个进程init(初始化进程),init启动完成之后意味着用户空间创建完成,init负责创建用户空间的进程的管理,当我们创建一个进程的时候是init按照自己的样子进行创建的或者按照父进程创建的。内核就相当于上帝而init进程就相当于上帝派下来管理人间事物的使者,使者大人负责创建进程和回收进程这类的杂事,当然使者大人也不是万能的,它也需要产生一个又一个进程帮助它完成任务,还有对于向内核申请资源的大事使者大人也不敢压下,还是会向内核报告,因为对于分配资源这种事,也只有内核才能完成,其他任何人都没有这个能力,在linux当中,内核就是上帝。
4、写时复制、保存现场
父进程创建子进程时请init程序批准,并向内核申请资源(cpu和内存的使用),子进程创建之初是与父进程共用一个用户空间的,当子进程自己独立之后要使用新的内存空间和数据进或者需要去修改自己的数据的时候父进程不允许的,因为一旦修改了你进程就没办法用了,然后把父进程的数据复制一份到子进程的用户空间单独单独修改,这也就是写时复制。
内核是如何对进程进行资源分配的呢?进程的销毁?
对cpu的分配 ,进程有那么多个,但是cpu只有一个,怎样进行分配呢?通过对cpu进行切片分时,一个进程使用一小会儿,比如说是5毫秒,五毫秒到了之后 不管这个进程有没有完成都要退下让下一个进程上去运行。但是如果有进程占着cpu不愿意下去呢?不可能会发生的情况,内核掌握一切,运行五毫秒之后不管怎样都会一脚把这个进程踢下去的。把当前的进程踢下去之后下次再运行的时候肯定要是沿着上一次的没有运行完成的地方继续运行,但是在什么地方保存着进程当前的状态呢?进程的运行状态保存在cpu的寄存器当中,当进程从cpu上退下之后其实是把进程的状态保存到内核的任务结构体当中,当又轮到该进程使用cpu的时候可以快速读取内存当中此进程的状态,然后沿着上一次执行的痕迹继续向下运行。保存状态的过程的称做保存现场,恢复状态的过程称做恢复现场,在内核当中保存的进程状态信息的容器叫做“任务结构体(内核用来存储进程状态的固定格式)”在用户空间是可以通过命令查看到些任务结构体的。如果好多个任务结构体放在一块就组成了一个链表。进程是白发人送黑发人的,父进程需要完成一个复杂任务时才创建子进程,完成任务之后返回结果,子进程完成之后由父进程进行销毁, 子进程在执行任务的时候父进程处在等待状态,父子关系保存到任务结构体当中,其优先级也保存到任务结构体当中,如果父进程没有来得及销毁子进程父进程就挂了的话也没有问题,因为有“上帝的使者”的存在,上帝的使者可以销毁这个进程。
进程是有优先级的.这个世界没有绝对的公平,在计算机的世界也是一样的,也是有优先级的。举个例子:比如一个ping请求到达主机,cpu就必须立刻做出回应,如果这个ping请求没有任务特权的话(不能立刻得到回应),当cpu有空闲时间来处理这个ping请求时,可以这个ping请求早就请求超时了,所以ping请求的优先级是比较小的,比较小就意味着优先级越高,能够被cpu优先执行。再比如:主机忽然断电了,还好我们的主机还有备用电源,当然也会有相应的进程,当这个进程查看到有断电情况会立刻做出决断,这种进程的优先级也是比较高的。
内核把进程的优先级划分了固定的个数0-139,共140个优先级,1-99是实时优先级,数据越大优先级越高,这一部分优先级是由内核直接管理的,root也不能插手。 100-139静态优先级(这一优先级范围内的进程root都是可以调整的):数字越小,优先级越高。相同优先级排成一列,这样的话无论是有多少个进程内核只要扫描一上这个链表都知道他们的优先级了。
nice是范围是-20到19,分别对应100-139,还是nice值越小优先级越高,调整nice值就相当于调整优先级,一个进程的默认优先级是0. 如果一个进程的NI从0调整到-5的话,就相当把进程的优先级就从120转换成了115,0对应120,120-5=115。普通用户只能让自己的进程的优先级值变大,变大意味着优先级降低,只有root可以随意的更改,当然也只能在100外调整。
当内核需要调用一个新的进程到cpu的时候就从此链表当中选择,当在cpu上运行完之后 会放到另一个链表当中,另一个链表的构造同这一个是一样的,当这一个链表上所有的进程都运行完了之后就向另一个链表当中选择进程去cpu运行。
对内存的分配,进程有那么多,内存也只有一个,怎样进行分配呢?我们知道用户空间的进程是不能直接与硬件打交道的,都要经过内核,内核会把内存给分成片,一片占据4K,这一片其实就是一个页框。内核把页框进行虚拟,虚拟成线性地址空间,当程序进行开发的时候,程序员假设内存有4G或者8G开发程序,其实一个程序是不能一下子把内存条都占用了,进程占用的其实是线性地址空间,这个线性地址空间是内核用来欺骗程序的,这个程序能使用多少真正的内存空间就分配给它多少空间,但是在进程看来它占用的是整个内存条,进程的存在于内核给它编织的虚拟世界当中。当真正的内存没有页框可以使用了,内核会扫描一下整个内存当中的页框,通过一个算法计算出使用最少的的页框放到swap分区,那么如果是这样做了,当真正使用这个页框的时候内核是怎样操作的呢?我们前面提过内核当中有一个进程任务结构体,这个结构体不仅保存了进程的状态还保存了进程使用了哪些线性地址空间还有对应的物理地址空间,当这个程序调用到cpu进行运行的时候,内核会通过读取这个任务结构体里面此进程对应的地址空间把页框从swap分区中重新加载到内存当中,在此过程当中会有一个异常就是缺页异常,因为内存当中的页框被调用到了swap当中了,不能马上找到这个页框,需要去硬件当中调用。
进程有没有可能摆脱内核的控制?进程是没有办法摆脱内核的控制,除非内核有漏洞,当进程由用户空间转向内核空间的时候会发生一次软中断 ,这一次中断其实就是让内核醒来的操作。
5、IO过程
IO分两上步骤,硬件--->内核---->进程
当我们在shell当中cat一个文件时候,cat 进程会请求内核帮它从硬盘当中读取出文件,因为只有内核可以与硬件打交道,当内核从硬盘当中读取了这个文件的内容之后 再把这个内容放到cat进程当中。也就是说,进程发起调用等两段时间,第二段才是真正的IO过程。
[root@zabbix ~]# time cp -rf /etc/ /tmp/etc.bak
real 0m6.493s
user 0m0.005s
sys 0m1.130s
[root@zabbix ~]# time cp -rf /etc/ /tmp/etc.bak
real 0m0.900s
user 0m0.003s
sys 0m0.895s
通过上图我们可以看出IO的一些情况,当第一次我们备份/etc/目录时,所花费的时间很长,因为这一次全新的IO,cp命令向内核申请,内核把数据从内核当中调用出来到内核空间,然后再分配给进程,这是两段过程。当第二次的时候因为数据已经在内存当中还没有清除,此时的IO就成了一段而不是两段,所以速度快了很多。
6、进程的类型、状态
类型
从进程的表现形式来看,进程可分为前台进程和守护进程:
-
守护进程,在系统引导过程启动的进程,跟终端无关的进程
-
前台进程,跟终端相关,通过终端启动的进程
也可以把在前台启动的进程送往后台,以守护模式运行。
从对资源的占用量来看,进程可分为cpu-bound
和io-bound
:
cpu-bound
(cpu密集型):占用cpu比较多的,比如蓝光高清电影,对内存的占用并不是很大,但cpu解码却很频繁,内核一直关注cpu,如果一个进程频繁的使用的cpu,内核就会对这个进程进行惩罚,把把它的优先级降低。如果主机上进程不多,虽然把它的优先级降低了,但是它依然频繁在cpu运行,但是如果有多个进程,它就要让别的进程先运行。
io-bound
(IO密集型):比如文本编辑器,对cpu占用并不多,但是却要频繁io,文本编辑器的进程优先级要高于看电影(人家把cpu的占用资源让出来了,给人家补偿就是把优先级调高,同时这正是我们需要的,我们输入一个字就想立马看到效果)
状态
运行态:
running
就绪态:ready
睡眠态:sleep
可中断:interruptable
不可中断:uninterruptable
停止态:stopped
暂停于内存中,但不会被调度,除非手动启动
僵死态:zombie
下面就把上述的进程状态解释一下
正在cpu上运行的状态:运行态,运行状态分为running
和runnable
,在链表当中等待被加载到cpu的状态:就绪态其实就是runnable
.
睡眠态-可中断的:自己的时间片用完了,不得不睡去,睡去之后,随时可叫醒,随时调度到cpu上随时可运行,不需要额外的数据准备。
不可中断的,比如cat
文件的时候还有等到内核把文件内容给取来的时候就是不可中断的,因为这时算把cat
进程放到cpu也没有用,因为没有数据。
停止态:比如我们使用vim
时,将其送往后台,vim
状态就会停止在stoped
状态。
僵死态:僵死态在上文提到过,简而言之就是子进程还没被父进程回收时,父进程突然挂了,这时“茫然无助”的子进程的状态被称做为僵死态。
二、命令&操作pstree
pstree显示进程的父子关系
-
-u显示每个进程所属的账户名称
-
-p显示进程的pid
[root@zabbix ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─rsyslogd───2*[{rsyslogd}]
├─smartd
├─sshd───sshd───bash─┬─pstree
└─vim
从上述显示来看,我们可以看到所有进程的的父进程都是systemd
,如果在centos6
上执行这条命令,systemd
就会变以init
。
ps
[root@zabbix ~]# ls /proc/
1 18 21 2966 32 4103 4148 60 7355 8262
[root@zabbix ~]# cat /proc/1/cmdline #我们发现1号进程是systemd
/usr/lib/systemd/systemd--switched-root--system--deserialize22
进程当前状态查看工具使用场景非常的多,显示的是静态信息,抓取是当前进程的快照。
在/proc
目录中有许多以数字结尾的文件,其实这些目录就是当前系统上正在运行程序的状态,被系统以目录的方式抓取了出来,以进程的pid
号命名,我们可以进入这些目录里面的cmdline
查看是由哪个命令发起的此进程。
其实linux
当中所有的进程的查看工具都是查看的这个文件当中的信息,为什么需要工具查看进程的状态,直接查看文件不行吗?当然可以,就是文件当中的信息不容易看懂,所以需要我们使用各种进程查看工具来把不容易看懂的信息抽象成人们容易看懂的信息。
ps -l
[root@zabbix ~]# ps -l #仅列出与当前shell相关的进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 18978 18976 0 80 0 - 29195 do_wai pts/0 00:00:00 bash
4 T 0 19222 18978 0 80 0 - 37915 do_sig pts/0 00:00:00 vim
0 R 0 19463 18978 0 80 0 - 38309 - pts/0 00:00:00 ps
通过上述显示,我们可以看出来当前shell
正在运行两个进程:vim
和ps
F:如果是4代表是进程的权限是
root
,0就代表是普通用户 。S:当前进程的状态,S代表s睡眠状态,R代表运行态,T停止状态
C:代表cpu的使用率。
PRI
和NI
是prioritytt和nice的缩写,数值越小代表越优先执行
ADDR
和SZ
、WCHAN
都与内存有关,ADDR
是进程在内存当中的地址,如果是运行状态的话就是-,SZ
代表进程用了多少内存,WCHAN
代表当前进程是否正在运行,如果是-代表正在运行.
TIME
代表在cpu
上运行了多长时间了
ps -U
显示某某用户运行哪些进程
[root@zabbix ~]# ps -U mysql
PID TTY TIME CMD
11045 ? 00:00:09 mysqld
ps aux
[root@zabbix ~]# ps aux #较为全面的显示全部进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 191240 4184 ? Ss 16:25 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 16:25 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 16:25 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 16:25 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 16:25 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 16:25 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 16:25 0:01 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 16:25 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 16:25 0:00 [watchdog/0]
选项a
代表把与终端有关的进程显示出来,选项x
表示把终端无关的进程显示出来,选项u
表示显示与用户相关的进程。
user进程的属主
pid进程的id号
%CPU占据cpu的时间百分比
%MEE占据内存的空间的百分比
VSZ:virtual memery size虚拟内存大小,在线性地址空间占用的空间大小
RSS:resdent size常驻内存集,不能被放到交换分区当中必须位于内存当中的数据占用的内存大小
TTY:通过哪个终端启动的,?表示与终端无关
STAT:进程的状态
R:runing
S:可中断睡眠
D:不可中断的睡眠
T:停止态
Z:僵死态
+表示这是一个前台进程
l(小L),表示这是一个多线程进程
N:低优先级进程
<高优先级进程
s:会话进程的领导进程,如果一个领导进程终端,那么这个进程领导的子进程也会终止
start表示启动时间
TIME:运行占据cpu的累积进长
COMMAND:由哪个命令启动的此进程,加中括号的表示是内核线程不是用户进程。
ps -elf
[root@zabbix ~]# ps -elf | head
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 47810 ep_pol 16:25 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 16:25 ? 00:00:00 [kthreadd]
-e
:相当于ax把与终端有关和无关的进程都显示出来
-l
:长格式列出(小写L)
-f
:显示完整格式的进程信息
uid:哪个用户发起的
PID:进程ID
PPID:父进程ID,0是指内核启动完init之后把将其禁止的进程
C:运行在了哪个cpu的编号
STIME:使用cpu的累积时间
ps -eFH
-F
比小f显示的信息更加的详细
-H
以层级格式显示进程的相关信息
[root@zabbix ~]# ps -eFH | head
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 2 0 0 0 0 3 16:25 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 0 16:25 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 0 0 0 16:25 ? 00:00:00 [kworker/0:0H]
root 7 2 0 0 0 0 16:25 ? 00:00:00 [migration/0]
root 8 2 0 0 0 0 16:25 ? 00:00:00 [rcu_bh]
root 9 2 0 0 0 3 16:25 ? 00:00:01 [rcu_sched]
root 10 2 0 0 0 0 16:25 ? 00:00:00 [lru-add-drain]
root 11 2 0 0 0 0 16:25 ? 00:00:00 [watchdog/0]
root 12 2 0 0 0 1 16:25 ? 00:00:00 [watchdog/1]
ps -exo(自定义显示)
[root@zabbix ~]# ps -exo pid,psr,command | head
PID PSR COMMAND
1 2 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
2 3 [kthreadd]
3 0 [ksoftirqd/0]
5 0 [kworker/0:0H]
7 0 [migration/0]
8 0 [rcu_bh]
9 0 [rcu_sched]
10 0 [lru-add-drain]
11 0 [watchdog/0]
常用的自定义选项:
ni
:nice值
pri
:priority优先级
psr
:processor运行在哪个cpu
rtprio
:实时优先级
pgrep
找出cron与syslog这两个服务的pid号码
[root@zabbix ~]# ps aux | egrep '(cron| syslog)'
root 8755 0.0 0.0 126284 1616 ? Ss 16:26 0:00 /usr/sbin/crond -n
root 19678 0.0 0.0 112708 992 pts/0 S+ 17:32 0:00 grep -E --color=auto (cron| syslog)
pgrep
就相当于ps aux | grep
其实有更简单的方式,如下:
[root@zabbix ~]# pgrep cron
8755
[root@zabbix ~]# pgrep syslog
8746
[root@zabbix ~]# pgrep -u root | head -2 #仅显示root运行的进程号
1
2
[root@zabbix ~]# pgrep -u root -l | head -2 #随便把进程的名字也显示出来
1 systemd
2 kthreadd
pkill
用法与pgrep
一样,后面直接跟进程的名字即可。
[root@zabbix ~]# pkill sshd
pidof
//根据进程名字获取pid号,反之不可
[root@zabbix ~]# pidof sshd
19919 19826
top
//指定几秒刷新一次,默认5秒
top –d 5
//使用-d此选项可以仅查看某一个进程的状态
top –p <pid号码>
显示进程的动态信息,ps是显示的是进程的静态信息,直接使用ps命令进程按照占用cpu的资源的多少排序,注意,下图当中的信息实际上是在不断的变化,如下:
top - 20:05:19 up 1:32, 2 users, load average: 0.09, 0.04, 0.05
Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3324936 total, 2368636 free, 365448 used, 590852 buff/cache
KiB Swap: 3538940 total, 3538940 free, 0 used. 2657500 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20058 root 20 0 162012 2300 1592 R 0.7 0.1 0:00.03 top
8353 root 20 0 320028 6744 5268 S 0.3 0.2 0:12.62 vmtoolsd
8732 root 20 0 573828 17228 6060 S 0.3 0.5 0:01.74 tuned
当使用top命令之后默认是使用cpu的占用的多少进行排序(%CPU)使用P表示,如果在这个界面当中按大写的M就会按照占用内存的多少来排序;也可以使用T累积占用cpu时间的多少进行排序(也就是TIME+)。
第一行02:17:41显示的是当前的系统时间,up 11:05是系统运行了多少时间,5user当前系统登录多少用户,load average
平均负载 cpu队列当中等待运行的任务的个数(也可以是排列的长度),并不是百分比,过去的一分钟,五分钟的平均长度(这是队列当中的进程的多少,越小越好,越小代表cpu的负载越低),十五分钟的平均负载状态。如果在top
命令当中没想显示此行的内容使用l
(小写的L)就可折叠,再次使用l
又会显示。这个地方显示的信息使用uptime
也可以显示,如下:
[root@China ~]# uptime
02:29:54 up 11:17, 5 users, load average: 0.04, 0.03, 0.05
第二行,tasks所有的进程的数量,后面就是处于运行状态的有多少个,睡眠状态的有多少个,停止状态的有多少个,僵死状态的有多少个。
第三行是cpu的负载情况:从下图我们看出当前有两个cpu,按数字1可以把所有cpu的负载信息都展开或者折叠显示,默认是是cpus,这表示是平均的负载情况,如下图:
top - 20:09:38 up 1:36, 2 users, load average: 0.00, 0.02, 0.05
Tasks: 158 total, 2 running, 156 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.6 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3324936 total, 2368140 free, 365928 used, 590868 buff/cache
us指用户空间占据的cpu百分比,sy内核空间的占用cpu的百分比,ni是nice占用cpu的空间,id空间比例,wa等待io完成占据的时间,如果这个时间过大的话代表磁盘太慢了已经成为了系统瓶颈了,hi(硬件中断)处理硬中断占据的百分比,si(软中断)是处理软中断占据的百分比,st cpu被偷走的时间的比例,如果系统中有运行虚拟化cpu的时间可能被偷走。
按t可以把task和cpu的负载信息都折叠或者是展开显示,如下图:
top - 20:11:08 up 1:38, 2 users, load average: 0.00, 0.01, 0.05
KiB Mem : 3324936 total, 2368124 free, 365924 used, 590888 buff/cache
KiB Swap: 3538940 total, 3538940 free, 0 used. 2656996 avail Mem
第三行,物理内存的总大小,已经使用的空间,空闲的空间,缓冲区的空间,与free -m的显示结果是差不多的 .如下所示:
[root@zabbix ~]# free -h
total used free shared buff/cache available
Mem: 3.2G 356M 2.3G 11M 577M 2.5G
Swap: 3.4G 0B 3.4G
最后一行的解释如下:
PR优先级
ni值
VIRT虚拟内存级
RES常驻内存级
SHR共享内存大小
S当前的简要状态
TIME+占据cpu的时长
htop
在htop里面可以使用鼠标,里面的选项与top是类似的,就不解释了。
三、偏门技巧1
当我们执行一个程序的时候,比如当我们用vim
编辑文件时,在命令模式下通过ctrl+z
可以将vim
送往后台执行,一旦进入后台之后,vim
就会变成stoped
状态,我们可以通过jobs命令看到其任务号,然后通过fg
命令可重新调用到前台来。
这种操作有什么用呢?当我们在操作vim
时如果忘记某个单词,就可以通过这种方式退出来查看,查看完成后再重新切换到vim
里面。
技巧2
通过killall
后面跟进程的名字可强行干掉某一个进程,与killall搭配的是-9
这个选项,意思为不考虑后果,强行干掉某个进程。
这种操作会用在什么地方呢?用来强杀某些进程的很有用,有时候有些服务会卡住,通过systemctl
无法停止,就用killall
这种方式,好使!
调整进程的优先级
//通过top命令我们看到mysql的优先级默认是0,所有进程的优先级默认都是0
[root@zabbix ~]# top -p `pgrep mysqld`
top - 20:41:16 up 2:08, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3324936 total, 2365040 free, 368300 used, 591596 buff/cache
KiB Swap: 3538940 total, 3538940 free, 0 used. 2654428 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11045 mysql 20 0 1384160 199104 6748 S 0.0 6.0 0:22.17 mysqld // 按r键,效果如下:
PID to renice [default pid = 11045] 11045 #输入要调整进程的PID号,回车之后再输入10
11045 mysql 20 0 1384160 199104 6748 S 0.0 6.0 0:22.52 mysqld
//效果如下图,优先级就变成10了
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11045 mysql 30 10 1384160 199104 6748 S 0.3 6.0 0:22.89 mysqld
上述我们针对的是已经运行起来的进程,下面我们来演示一下,对没有运行起来的进程,我们怎样调整它的优先级。
//运行top并指定nice为9,当然也可以指定成负的,比如-3
[root@zabbix ~]# nice -n 9 top
//通过这条命令可以验证
[root@zabbix ~]# ps -axo pid,ni,command | grep top
7198 9 top
7237 0 grep top