多用户多任务分时操作系统多用户多任务分时操作系统允许多个用户共享使用同一台计算机的资源,即在一台计算机上联接几台甚至几十台终端机,终端机可以没有自己的CPU与内存,只有键盘与显示器,每个用户都通过各自的终端机使用这台计算机的资源,计算机按固定的时间片轮流为各个终端服务由于计算机的处理速度很快,用户感觉不到等待时间,似乎这台计算机专为自己服务一样UNIX就是典型的多用户多任务分时操作系统,这类操作系统通常用在大、中、小型计算机或工作站中分类:(单用户单任务、单用户多任务、多用户多任务、多用户单任务)多任务是同时可以执行多个任务,并行处理,就象你可以一边听歌,一边打游戏样,LINUX都是做大型服务器的,支持同时为多个用户提供服务,而我们的家用机实际上都是单用户多任务Linux是一个多用户多任务的操作系统多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务操作系统管理多个用户的请求和多个任务大多数系统都只有一个CPU和一个主存,但一个系统可能有多个二级存储磁盘和多个输入/输出设备操作系统管理这些资源并在多个用户间共享资源,当您提出一个请求时,给您造成一种假象,好象系统只被您独自占用。
而实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系统任务、邮件和打印作业等操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片大约都有零点几秒,虽然看起来很短,但实际上已经足够计算机完成成千上万的指令集每个任务都会被系统运行一段时间,然后挂起,系统转而处理其他任务;过一段时间以后再回来处理这个任务,直到某个任务完成,从任务队列中去除一,进程及作业Linux系统上所有运行的东西都可以称之为一个进程每个用户任务、每个系统管理守护进程,都可以称之为进程Linux用分时管理方法使所有的任务共同分享系统资源我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个单独的程序进程与程序是有区别的,进程不是程序,虽然它由程序产生程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序而且一个程序可以启动多个进程进程和作业的概念也有区别一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令作业控制指的是控制正在运行的进程的行为。
比如,用户可以挂起一个进程,等一会儿再继续执行该进程°shelI将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其他的事情其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没有离开编辑器一样这只是一个例子,作业控制还有许多其他实际的用途二,启动进程键入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动1,手工启动由用户输入命令,直接启动一个进程便是手工启动进程但手工启动进程又可以分为前台启动和后台启动前台启动是手工启动一个进程的最常用的方式一般地,用户键入一个命令“Is-1〃,这就已经启动了一个进程,而且是一个前台的进程这时候系统其实已经处于一个多进程状态。
或许有些用户会疑惑:我只启动了一个进程而已但实际上有许多运行在后台的、系统启动时就已经自动启动的进程正在悄悄运行着还有的用户在键入“Is-1〃命令以后赶紧使用“ps-x〃查看,却没有看到Is进程,也觉得很奇怪其实这是因为Is这个进程结束太快,使用ps查看时该进程已经执行结束了直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候假设用户要启动一个需要长时间运行的格式化文本文件的进程为了不使整个sheII在格式化过程中都处于“瘫痪〃状态,从后台启动这个进程是明智的选择2,调度启动有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这一切工作要使用自动启动进程的功能,就需要掌握以下几个启动命令第一个重要的命令是at命令用户使用at命令在指定时刻执行指定的命令序列也就是说,该命令至少需要指定一个命令、一个执行时间才可以正常运行at命令可以只指定时间,也可以时间和日期一起指定需要注意的是,指定时间有个系统判别问题比如说:用户现在指定了一个执行时间:凌晨3:20,而发出at命令的时间是头天晚上的20:00,那么究竟是在哪一天执行该命令呢?如果用户在3:20以前仍然在工作,那么该命令将在这个时候完成;如果用户3:20以前就退出了工作状态,那么该命令将在第二天凌晨才得到执行。
下面是at命令的语法格式:at[-V][-q队列][-f文件名][-mIdbv]时间at-c作业[作业...]at允许使用一套相当复杂的指定时间的方法,它可以接受在当天的hh:mm(小时:分钟)式的时间指定如果该时间已经过去,那么就放在第二天执行当然也可以使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间用户还可以采用12小时计时制,即在时间后面加上AM(上午)或者PM(下午)来说明是上午还是下午也可以指定命令执行的具体日期,指定格式为monthday(月日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)指定的日期必须跟在指定时间的后面上面介绍的都是绝对计时法,其实还可以使用相对计时法,这对于安排不久就要执行的命令是很有好处的指定格式为:now+counttime-units,now就是当前时间,time-units是时间单位,这里可以是minutes(分钟)、hours(小时)、days(天)、weeks(星期)count是时间的数量,究竟是几天,还是几小时,等等还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
下面通过一些例子来说明具体用法[例]指定在今天下午5:30执行某命令假设现在时间是中午12:30,2001年2月24日,其命令格式如下:at5:30pmat17:30at17:30todayatnow+5hoursatnow+300minutesat17:3024.2.99at17:302/24/99at17:30Feb24以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误的情况发生,例如上例可以写成:at17:302/24/99这样非常清楚,而且别人也看得懂对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者在7月31日上午10点执行文件work中的作业在任何情况下,超级用户都可以使用这个命令对于其他用户来说,是否可以使用就取决于两个文件:/etc/at.allow和/etc/at.deny。
cron命令前面介绍的两条命令都会在一定时间内完成一定任务,但是要注意它们都只能执行一次也就是说,当指定了运行命令后,系统在指定时间完成任务,一切就结束了但是在很多时候需要不断重复一些命令,比如:某公司每周一自动向员工报告头一周公司的活动情况,这时候就需要使用cron命令来完成任务了实际上,cron命令是不应该手工启动的cron命令在系统启动时就由一个shell脚本自动启动,进入后台(所以不需要使用&符号)一般的用户没有运行该命令的权限,虽然超级用户可以手工启动cron,不过还是建议将其放到shell脚本中由系统自行启动首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将载入内存例如一个用户名为foxy的用户,它所对应的crontab文件就应该是/var/spool/cron/foxy也就是说,以该用户命名的crontab文件存放在/var/spool/cron目录下面cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入''休眠〃状态,释放系统资源。
所以该后台进程占用资源极少它每分钟“醒”过来一次,查看当前是否有需要运行的命令命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户上面简单介绍了一些cron的工作原理,但是cron命令的执行不需要用户干涉;需要用户修改的是crontab中要执行的命令序列,所以下面介绍crontab命令crontab命令crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行每个用户都可以有自己的crontab文件下面就来看看如何创建一个crontab文件在/var/spool/cron下的crontab文件不可以直接创建或者直接修改crontab文件是通过crontab命令得到的现在假设有个用户名为foxy,需要创建自己的一个crontab文件首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时间然后存盘退出假设该文件为/tmp/test.cron再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。
键入:crontabtest.cron这样一个crontab文件就建立好了可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件这个文件就是所需的crontab文件在crontab文件中如何输入需要执行的命令和时间该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令每个域之间使用空格或者制表符分隔格式如下:minutehourday-of-monthmonth-of-yearday-of-weekcommands第一项是分钟,第二项是小时,第三项是一个月的第几天,第四项是一年的第几个月,第五项是一周的星期几,第六项是要执行的命令这些项都不能为空,必须填入如果用户不需要指定其中的几项,那么可以使用*代替因为*是统配符,可以代替任何字符,所以就可以认为是任何时间,也就是该项被忽略了进程的挂起及恢复命令bg、fg作业控制允许将进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行只要在键盘上按ctrl+z,即可挂起当前的前台作业在键盘上按ctrl+z后,将挂起当前执行的命令cat使用jobs命令可以显示shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。