第十四章进程管理
之前我们只是介绍了进程管理的几个基本命令,但关于进程的具体管理细节,我们将在本章详细介绍。
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的两个授权文件一样,这里不再赘述。