Linux循序渐进(12)

  第十一课 进程管理及作业控制()  

  Linux是一个多任务的操作系统系统上同时运行着多个进程正在执行的一个或多个相关进程称为一个作业使用作业控制用户可以同时运行多个作业并在需要时在作业之间进行切换本章详细介绍进程管理及作业控制的命令包括启动进程查看进程调度作业的命令

  进程及作业的概念

  Linux是一个多用户多任务的操作系统多用户是指多个用户可以在同一时间使用计算机系统多任务是指Linux可以同时执行几个任务它可以在还未执行完一个任务时又执行另一项任务

  操作系统管理多个用户的请求和多个任务大多数系统都只有一个CPU和一个主存但一个系统可能有多个二级存储磁盘和多个输入/输出设备操作系统管理这些资源并在多个用户间共享资源当您提出一个请求时给您造成一种假象好象系统只被您独自占用而实际上操作系统监控着一个等待执行的任务队列这些任务包括用户作业操作系统任务邮件和打印作业等操作系统根据每个任务的优先级为每个任务分配合适的时间片每个时间片大约都有零点几秒虽然看起来很短但实际上已经足够计算机完成成千上万的指令集每个任务都会被系统运行一段时间然后挂起系统转而处理其他任务过一段时间以后再回来处理这个任务直到某个任务完成从任务队列中去除

  Linux系统上所有运行的东西都可以称之为一个进程每个用户任务每个系统管理守护进程都可以称之为进程Linux用分时管理方法使所有 的任务共同分享系统资源我们讨论进程的时候不会去关心这些进程究竟是如何分配的或者是内核如何管理分配时间片的我们所关心的是如何去控制这些进程让它们能够很好地为用户服务

  进程的一个比较正式的定义是在自身的虚拟地址空间运行的一个单独的程序进程与程序是有区别的进程不是程序虽然它由程序产生程序只是一个静态的指令集合不占系统的运行资源而进程是一个随时都可能发生变化的动态的使用系统运行资源的程序而且一个程序可以启动多个进程

  Linux操作系统包括三种不同类型的进程每种进程都有自己的特点和属性

  交互进程——由一个shell启动的进程交互进程既可以在前台运行也可以在后台运行   批处理进程——这种进程和终端没有联系是一个进程序列   监控进程(也称守护进程)——Linux系统启动时启动的进程并在后台运行   上述三种进程各有各的作用使用场合也有所不同

  进程和作业的概念也有区别一个正在执行的进程称为一个作业而且作业可以包含一个或多个进程尤其是当使用了管道和重定向命令例如nroff man ps|grep kill|more这个作业就同时启动了三个进程

  作业控制指的是控制正在运行的进程的行为比如用户可以挂起一个进程等一会儿再继续执行该进程shell将记录所有启动的进程情况在每个进程过程中用户可以任意地挂起进程或重新启动进程作业控制是许多shell(包括bash和tcsh)的一个特性使用户能在多个独立作业间进行切换

  一般而言进程与作业控制相关联时才被称为作业

  在大多数情况下用户在同一时间只运行一个作业即它们最后向shell键入的命令但是使用作业控制用户可以同时运行多个作业并在需要时在这些作业间进行切换这会有什么用途呢?例如当用户编辑一个文本文件并需要中止编辑做其他事情时利用作业控制用户可以让编辑器暂时挂起返回shell提示符开始做其他的事情其他事情做完以后用户可以重新启动挂起的编辑器返回到刚才中止的地方就象用户从来没有离开编辑器一样这只是一个例子作业控制还有许多其他实际的用途

  启动进程

  键入需要运行的程序的程序名执行一个程序其实也就是启动了一个进程在Linux系统中每个进程都具有一个进程号用于系统识别和调度进程启动一个进程有两个主要途径手工启动和调度启动后者是事先进行设置根据用户要求自行启动

  手工启动

  由用户输入命令直接启动一个进程便是手工启动进程但手工启动进程又可以分为很多种根据启动的进程类型不同性质不同实际结果也不一样下面分别介绍

   前台启动

这或许是手工启动一个进程的最常用的方式一般地用户键入一个命令ls –l这就已经启动了一个进程而且是一个前台的进程这时候系统其实已经处于一个多进程状态或许有些用户会疑惑我只启动了一个进程而已但实际上有许多运行在后台的系统启动时就已经自动启动的进程正在悄悄运行着还有的用户在键入ls –l命令以后赶紧使用ps –x查看却没有看到ls进程也觉得很奇怪其实这是因为ls这个进程结束太快使用ps查看时该进程已经执行结束了如果启动一个比较耗时的进程:

  find / name foxjpg

  然后再把该进程挂起使用ps查看就会看到一个find进程在里面

   后台启动

  直接从后台手工启动一个进程用得比较少一些除非是该进程甚为耗时且用户也不急着需要结果的时候假设用户要启动一个需要长时间运行的格式化文本文件的进程为了不使整个shell在格式化过程中都处于瘫痪状态从后台启动这个进程是明智的选择

  [例]

  $ troff –me notes > note_form &

  []

  $

  由上例可见从后台启动进程其实就是在命令结尾加上一个&号键入命令以后出现一个数字这个数字就是该进程的编号也称为PID然后就出现了提示符用户可以继续其他工作

  上面介绍了前后台启动的两种情况实际上这两种启动方式有个共同的特点就是新进程都是由当前shell这个进程产生的也就是说是shell创建了新进程于是就称这种关系为进程间的父子关系这里shell是父进程而新进程是子进程一个父进程可以有多个子进程一般地子进程结束后才能继续父进程当然如果是从后台启动那就不用等待子进程结束了

  一种比较特殊的情况是在使用管道符的时候例如

  nroff man ps|grep kill|more

  这时候实际上是同时启动了三个进程请注意是同时启动的所有放在管道两边的进程都将被同时启动它们都是当前shell的子程序互相之间可以称为兄弟进程

  以上介绍的是手工启动进程的一些内容作为一名系统管理员很多时候都需要把事情安排好以后让其自动运行因为管理员不是机器也有离开的时候所以有些必须要做的工作而恰好管理员不能亲自操作这时候就需要使用调度启动进程了

  调度启动

  有时候需要对系统进行一些比较费时而且占用资源的维护工作这些工作适合在深夜进行这时候用户就可以事先进行调度安排指定任务运行的时间或者场合到时候系统会自动完成这一切工作

  要使用自动启动进程的功能就需要掌握以下几个启动命令

  at命令

  用户使用at命令在指定时刻执行指定的命令序列也就是说该命令至少需要指定一个命令一个执行时间才可以正常运行at命令可以只指定时间也可以时间和日期一起指定需要注意的是指定时间有个系统判别问题比如说用户现在指定了一个执行时间凌晨:而发出at命令的时间是头天晚上的:那么究竟是在哪一天执行该命令呢?如果用户在:以前仍然在工作那么该命令将在这个时候完成如果用户:以前就退出了工作状态那么该命令将在第二天凌晨才得到执行下面是at命令的语法格式

  at [V] [q 队列] [f 文件名] [mldbv] 时间

  at c 作业 [作业]

  at允许使用一套相当复杂的指定时间的方法实际上是将POSIX标准扩展了它可以接受在当天的hh:mm(小时:分钟)式的时间指定如果该时间已经过去那么就放在第二天执行当然也可以使用midnight(深夜)noon(中午)teatime(饮茶时间一般是下午点)等比较模糊的词语来指定时间用户还可以采用小时计时制即在时间后面加上AM(上午)或者PM(下午)来说明是上午还是下午

  也可以指定命令执行的具体日期指定格式为month day(月 日)或者mm/dd/yy(月/日/年)或者ddmmyy(日月年)指定的日期必须跟在指定时间的后面

  上面介绍的都是绝对计时法其实还可以使用相对计时法这对于安排不久就要执行的命令是很有好处的指定格式为now + count timeunits now就是当前时间timeunits是时间单位这里可以是 minutes(分钟)hours(小时)days(天)weeks(星期)count是时间的数量究竟是几天还是几小时等等

  还有一种计时方法就是直接使用today(今天)tomorrow(明天)来指定完成命令的时间下面通过一些例子来说明具体用法

  [例] 指定在今天下午:执行某命令假设现在时间是中午:年月日其命令格式如下

  at :pm

  at :

  at : today

  at now + hours

  at now + minutes

  at :

  at : //

  at : Feb

  以上这些命令表达的意义是完全一样的所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择一般采用绝对时间的小时计时法可以避免由于用户自己的疏忽造成计时错误的情况发生例如上例可以写成

  at : //

  这样非常清楚而 梦想,并不奢侈,只要勇敢地迈出第一步。

Linux循序渐进(12)

相关文章:

你感兴趣的文章:

标签云: