首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十四章 进程管理

第十四章 进程管理

作者头像
晓天
发布2019-07-04 14:20:48
9300
发布2019-07-04 14:20:48
举报

第十四章进程管理

之前我们只是介绍了进程管理的几个基本命令,但关于进程的具体管理细节,我们将在本章详细介绍。

14.1 进程调度

14.1.1 进程状态

在操作系统中,不仅限Linux、windows,包括其他的操作系统,关于进程的运行都有三种状态,通俗定义如下:

1) 前台运行:占据cpu、内存资源,运行过程可见

2) 后台运行:不争抢cpu、内存资源,只在资源空闲时运行,运行过程不可见,只把运行结果显示到前台

3) 后台挂起(暂停):由于进程的运行条件不满足,进程处于暂停等待状态

jobs ---查看后台进程,可见后台运行、挂起进程及其编号,如下图:

图中jobs看到的两个进程都是出于挂起状态的(显示:已停止或stoped)。

14.1.2 进程调度

那么,我们该如何在这三种状态间调度进程呢?来看下列操作:

直接进入前台运行:输入命令运行

直接进入后台运行:命令后加 & 符号

前台运行=>后台挂起: ctrl+z 组合键,上图中即是使用组合键的效果

挂起=>前台运行:fg ---把最后一个挂起的进程放入前台

fg X ---把指定编号的进程放入前台运行

挂起=>后台运行:bg 或 bg X

后台运行=>前台运行:fg 或 fg X

其实进程状态间的调度,看下图会更直观一些:

图中,有箭头指向的说明可以调度过去,没有箭头指向的说明无法调度。

14.1.3 进程杀死

之前,我们介绍过杀死进程是用kill -9命令,但具体kill命令的功能和参数将在本节做介绍。

kill命令,只看单词的中文意思,是杀死,但是在Linux系统中,它并不只是杀死进程的功能,它的真正功能是给指定的进程增加标记信号(sign),从而让CPU根据信号的值,对进程做出相应的处理。我们可以用kill –l命令查看所有可用的信号。

如图,可见kill的可用信号非常多,常用的信号功能可参看下表:

HUP 1 终端断线

INT 2 中断(同 Ctrl +C)

QUIT 3 退出(同 Ctrl + \),会携带内存中数据出来,可导入到某文件中,便于分析程序bug,一般开发人员会用到

TERM 15 终止

KILL 9 强制终止

CONT 18 继续(与STOP相反, fg/bg命令)

STOP 19 暂停(同 Ctrl +Z)

所以,我们之前常用的kill -9 是实质给进程增加了9号标记,CPU看到后,按9对应的功能将进程强制终止了。

14.1.4 nohup处理

我们知道,当一个用户注销退出时,它所占的内存会被清空,即该用户启动的进程会自动关闭。但如果我们想让某个进程在用户注销后,仍然能在后台继续运行,则可以在调用进程时用nohup命令将其放入后台执行,如下:

nohup find / -name f1 &

注:一般nohup命令都是和&后台执行符一起使用的,则直接放入后台,用户注销,进程不关闭。

14.1.5 进程优先级

在讲CPU运行队列时,我们提到过进程的优先级的概念。Linux中进程的优先级共有40级,级别数字范围:-20 到 19,数字越小,优先级越高,即越优先被执行 。默认级别是0。在ps命令的 –l参数可查看到各进程的优先级:

其中,NI列表示进程的优先级,也可以将-l参数配合其他参数一起使用,查看更多信息,如:ps -efl。

当我们在调用进程时,可以直接设定进程的优先级,命令如下:

nice--20 find / -name f1 ---执行进程,并设置优先级为最高,即-20

注:此命令中 参数 --20,第一个– 表示参数符号,第二个-表示数字的负号。

nice -19 find / -name f2 ---执行进程,并设置优先级为最低,即19

另外,若想更改当前已运行起来的进程的优先级,可使用renice命令:

renice 19 40478 ---给已经运行的、指定PID的进程,更改优先级。

结合之前的知识,使用sar 1 1 命令查看CPU使用率时,即%nice表示被更改了优先级的进程占CPU的比例。

14.2 守护进程

14.2.1 进程分类

Linux中,运行的进程按照功能、启用方式分可分为如下三种进程:

1)交互进程:人为手动输入的命令启动的进程

2)批处理进程:即脚本,把多个命令按照一定的逻辑顺序,编写成一个实现完整功能的小程序。

3)守护进程:监控本机某项服务、某个功能、某个端口的进程,称为守护进程。

关于守护进程,系统中监控不同业务的进程各不相同,如:一台web服务器,服务是工作在TCP80端口的,那么就会有专职的进程监听着80端口的访问,若有客户端请求连接80端口,则会被监控进程所捕获,开始对客户提供web服务;又如,Linux字符界面下,我们可以输入ALT+F1-F6在6个终端间相互切换,那么就会有一个进程监控着键盘的操作,一旦有ALT+FX的操作,就会立即激活相应的tty终端。这些都是守护进程类别的,只是监控的服务不同。

当然系统中还有监控时间服务的守护进程,当到达指定的时间时,就会激活某项操作。下面我们就为大家介绍两个监控时间的守护进程:at和cron

14.3 at定点运行进程

如果我们想让某个进程在指定的时间运行,就可以使用at命令来设定点进程。命令如下:

at 14:31 ---创建定点运行进程,回车后进入at的 命令编辑界面

at> echo hello > /mnt/f1 ---输入要在定点运行的命令

at>echo hello hello >> /mnt/f1

ctrl +d 组合键停止编辑

等时间到了后,就会自动执行我们设定的命令。这里大家可以做一下实验,若定点运行的命令只是echo输出,并没有导入到文件中,则到时间后会显示出来吗?会发现并没有显示出来,这是因为at定点执行的命令,是在后台执行,且运行结果也是在后台,前台不可见,所以只能通过命令结果导到磁盘文件上的方式验证,这里大家需要留意一下。

另外at还有另一种设定格式,如下:

at now+3min ---设定3分钟以后指定的进程

为了后面的实验,我们可以先多做几个距离时间较长的at进程。

当我们设定好定点进程后,可以使用atq命令查看未运行的定点进程:

如图,可见到最左侧显示的是定点进程的编号(从开机后设定的定点进程统一编号),后面有定点的时间。如果我们想查看其具体命令内容,可以使用–c参数,删除是-r参数:

at -c X ---查看指定编号的定点进程内容,X表示atq中显示的编号

at -r X ---删除指定编号的定点进程

我们再来思考一下,既然设定了定点进程,那么这个进程是在内存中存放还是在磁盘分区中存放呢?答案是后者。其实当我们创建了at进程后,系统会自动在/var/spool/at/目录下创建该进程的可执行文件,我们可以cd进去查看到绿色的可执行程序。也可以vi它看里面具体的命令设置。

其实,当我们at –c查看某个定点进程时,就是cat的这个进程文件。使用at –r删除时,实质上也是rm删除的这个文件。

另外,Linux系统中默认所有用户都可以使用at功能,但是也可以通过配置文件来限制用户使用at。具体如下:

vi /etc/at.deny ---编辑at功能的拒绝用户列表文件

zhang

lisi

保存退出

则,即写入这个文件中的账号,拒绝使用at功能。如下图:

/etc/at.deny这个文件默认是存在在系统中的,但是还有一个文件:at.allow,默认是不存在的,at.allow文件中指定仅允许谁使用at功能,即at.allow中没有写的用户是不允许使用at的。但我们也会发现,若at.deny和at.allow中的设置有冲突的话该以谁为准呢?其实,Linux中规定,当这两个文件并存时(因为默认只有at.deny,没有at.allow),以at.allow为准,at.deny将被完全失效。

14.4 计划任务

虽然at命令很方便执行,但也有缺点:命令只能执行一次,执行过后将自动被删除。若想要让某个操作周期性定点运行,则需要用到cron计划任务了。

编辑计划任务的命令是crontab,必须注意里面的书写格式,具体如下:

crontab -e ---编辑本人的计划任务,即其中设定的命令以当前用户的身份执行

格式:分 时 日 月 周 命令绝对路径(可以用whereis查到)

例:00 02 * * * /usr/sbin/reboot ---每天2点重启

00 02 * * 0 /usr/bin/rm -rf /tmp/*

---每周日凌晨2点清空临时数据所在的目录,表示周几用0-6

00 02 1 * * /usr/bin/rm -rf /tmp/*

---每月1号

00 02 1 1,4,7,10 * /usr/bin/rm -rf /tmp/*

---每三个月一次

00 02 1 */3 * /usr/bin/rm -rf /tmp/*

---每三个月一次,功能同上。*/n 是设定间隔频率的一种方式

*/10 * * * 1-5 /mnt/cpuCheck.sh

---周一到周五,每10分钟运行一次自定义脚本

编辑好的计划任务,到时会自动运行,再次执行crontab–e 命令即可二次编辑或更改。其他相关的查看、删除命令如下:

crontab -l ---查看当前用户的计划任务

crontab -r ---删除当前用户的计划任务

需要说明的是,每个用户登录进系统,设定的计划任务都是以该用户身份运行里面命令和访问相关文件的,访问权限也是遵守该用户身份的。但我们也可以使用root用户,给其他用户设定计划任务,如下:

crontab -e -u zhang ---以root身份登录后,可以给指定用户编辑计划任务注:这样设定的计划任务将以zhang用户的身份执行里面的命令。

crontab -l -u zhang ---查看指定用户的计划任务

crontab -r -u zhang ---删除指定用户的计划任务

同at一样,我们设定好计划任务后,系统也会有专用的文件记录各个用户的计划任务。计划任务的文件存放在/var/spool/cron/目录下,文件名以用户名命名,代表该用户的计划任务,如下图:

同at类似,其实crontab –l 就是cat的对应用户的计划任务文件,crontab–r就是rm的计划任务文件。

同样,cron也有自己的授权管理文件cron.deny(默认存在)和cron.allow(默认不存在)。这两个文件的功能和关系与at的两个授权文件一样,这里不再赘述。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档