第二章 (作者:胡靓)
第四节:
进程控制
一:查看进程
程序的一次执行就叫一个进程。换句话说,进程就是正在执行的程序,shell会对每个要执行的程序都启动一个进程。当程序运行结束,进程也随之消失。在unix中,允许同时运行多个程序,也就会有多个进程同时存在,所以,每个进程都得有一个代号,简称为进程号。进程号以一个数字的形式唯一的标识了每个进程。
从系统启动开始,unix就会生成一个“0号”进程,然后依次产生其它进程。产生其它进程的叫父进程,被产生的是子进程,每个用户的shell也是一个进程,而我们在shell的提示符下所有执行的指令也会产生一个进程,这些进程都是shell的子进程。
每个进程都可以以两种方式存在,正在执行中的程序的进程,它可以直接从终端读写,这个进程称为前台进程。当然,还有许多也在运行但是并不从终端读写的进程,称为后台进程。原则上,每个终端只能有一个前台进程。我们每次键入命令运行的指令都是前台进程,当我们想把某指令产生的进程当作后台进程时,只需在指令的后面加上“&”即可。
如:对一个大文件排序:可能会运行很长的时间,它将占住我们的终端,使用户不能做其它的工作。然而,我们要是将这个排序进程放到后台去,在前台我们就可以做别的工作,而大文件的排序工作仍然进行。
$sort largefile&<CR>
385
$
这样,很快就回系统提示符,计算机开始在后台对文件进行排序。将一个指令放到后台运行后,它不再控制终端,而只是显示出它的进程号就退回到提示符下。
1. 显示活动进程
利用ps指令可以查看当前所有活动的进程,它可以获得进程的代号,一般ps的格式如下:
ps [-elf]
如果不加选项,ps打印目前属于你的进程:
$ ps <CR>
PID TTY TIME COMMAND
426 05 0:01 ksh
560 05 0:00 ps
$
其中,ps的显示的内容如下:
PID :表示进程的代号;
TTY:终端号码;
TIME:进程已经执行的时间,即进程总共花费CPU的时间;
COMMAND:进程名称,创建这个进程所使用的命令行。
使用ps命令的选项时,其选项含义如下:
-l:以较多信息的长格式打印,显示系统启动以来所有的进程,而且栏数比较多。但是在一般的终端上,这个选项的显示都比较乱,所以不常用。
-e:打印出每个用户的进程,所有在unix下执行的进程。
-f:将当前进程与它的父进程一起打印。
2.中断进程
利用kill指令,我们可以中断或传递一些信息给进程。当前进程接收到信号后,一般会有如下的动作:
(1)直接执行kill的信号设定的动作。一般有:①中断、②保留内存映象以供查错使用、③正常退出;
(2)忽略这个信号,进程仍然运行;
(3)执行信号定义的函数。
一般kill的格式如下:
kill -选项目 进程代号
进程代号就是要处理的进程,可以同时用空格在后面连续填上多个进程代号。其中,选项以数字来表示,它表示要传递给进程的信号。在kill指令中一般常用的有如下的信号:
-1:暂停;
-2:中断;
-3:退出信号;
-9:强行退出,不可忽略;
-10:通道错误;
-11:非法内存区;
-12:系统调用参数非法;
-14:闹钟中断;
-15:软件结束信号;
-16:用户定义信号一;
-17:用户定义信号二;
比如:要中断一个代号为724的进程:
$ kill 724<CR>
实际上,使用“kill -2”,相当于我们按下<CTRL><END>或<BREAD>键,而“kill
-9”会无条件结束一个进程,这对于那些会造成死机的进程,只能这样清除它。有时候,当我们不带参数时,kill指令不一定会被进程理睬,这时,我们就可以“kill
-9”来强行清除一个进程。
但是,使用kill有时会出现如下两种情况:
(1)当kill一个进程时,其父进程也消失;
(2)kill一个父进程时,其子进程成为“孤儿”;
以上第(1)种情况没什么危害,而第(2)种则会造成资源的浪费,所以,我们最好从进程号比较大的进程开始kill,因为它们总是后来者,是由前面的进程产生的子进程。
3.调整进程的优先级
unix允许多个进程同时存在,然而每一时刻只有一个进程能被执行,一般由unix自己排序决定。
unix为每一个进程指定一个优先级数值,此值从0到39,此值越小,进程享用计算机资源的权利就越高。当然,在一个很忙碌的计算机系统中,优先级为0的进程肯定比优先级为39的进程先运行完毕。一般我们在提示符下键入的命令执行的进程的优先级都是和我们使用的shell的优先级是一样的,一般用户的shell的优先级都是20。
unix允许我们在执行指令时设定它的优先级,其作法如下:
nice [-数值] 指令
“数值”的范围为从01到19,表示unix在执行这一条指令时,将优先级设为“20+数值”,若略去“数值”,则缺省的设定为20。
从这里可以看出,一般只能将进程的优先级调低。
如:$ nice -12 sort largefile<CR>
将sort的优先级调成32。
而超级用户可以使用负的数值,将进程的优先级调高:
如:# nice --5 ksh<CR>
启动kshell,并且将优先级调成15。