|
第28章运行级别脚本
如果希望在系统启动时自动运行某些应用程序、服务或脚本,或者在系统重启动时能够
正确地关闭这些程序,那么需要创建运行级别脚本。除一种L I N U X变体外,所有的L I N U X版
本都含有这种基于系统V的运行级别配置目录,就像其他U N I X版本那样。
既然所有的系统都含有这种类型的配置,我们在本章中将会对它加以介绍,但如果你的
系统不含有这种目录,也不要紧。还可以通过其他方法在系统启动时自动运行程序;本章的
后半部分也将介绍这些方法。
本章包含下列内容:
• 运行级别。
• 如何创建r c . s c r i p t s。
• 如何在不同的运行级别实现相应的r c . s c r i p t s。
• 如何从i n i t t a b中启动应用程序。
能够创建运行级别脚本就意味着能够更灵活地控制系统。如果需要在某一个特定的运行
级别启动或停止程序,就得创建运行级别脚本(它们通常被称为r c . s c r i p t)。
任何用关键字s t a r t或s t o p调用的、能够启动或停止程序运行的脚本都可以看作是一个
r c . s c r i p t。注意,应当由用户来保证他或她所提交的脚本是一个有效的脚本,能够正确地启动
或停止某一服务。
运行级别配置目录的机制使得r c . s c r i p t只在系统切换运行级别时有效。它不负责检查某一
运行级别中所有的特定服务是否都已经被启动或停止。这是s h e l l编程者的事。
还可以按照希望运行的服务来控制系统的运行级别,但是这已经超出了本书的讨论范围。
28.1 怎么知道系统中是否含有运行级别目录
r c . s c r i p t s一般保存在( 实际上是个链接,这一点我们将在后面讲述) / e t c / r c N . d或
/ e t c / r c . d / r c N . d目录下,
其中,N是一个数字。通常是7个,因为r c N . d目录的序号是从0到6,不过在系统上可能会
有另外几个目录,如r c S . d。这并不重要,这里我们只关心带有数字的目录。
如果是L I N U X系统,那么⋯⋯
(续)
如果我们使用c d命令进入这些r c N . d目录,会发现这些目录中的r c . s c r i p t s实际上是一些链
接。
28.2 确定当前的运行级别
本章不是针对系统管理员的,但是作为s h e l l编程者,应当了解r c . s c r i p t s是什么,它们是被
怎样放置到运行级别配置目录中的。顺便说一下,如果想知道当前的运行级别,可以用下面
的命令:
在‘run level’后面的数字就是当前的运行级别。后面的时间是系统最近一次重启动的时
间。
如果是L I N U X系统,那么⋯⋯
$ runlevel
2 3
第一列表示系统的前一个运行级别,第二列表示系统当前的运行级别,在这里是3。
28.3 快速熟悉inittab
运行级别目录中含有一系列启动服务的脚本。这里的“服务”可以是守护进程、应用程
序、服务器、子系统或脚本进程。在系统启动的过程中,将会启动一个名为i n i t的进程(它是
系统中所有进程的祖先)。它所要完成的一部分工作就是看看需要启动哪些服务,应当缺省地
进入哪一个运行级别。它通过查看一个名为i n i t t a b的配置文件来获得上述信息,该配置文件位
于/ e t c目录下。i n i t进程还按照该文件中的设置加载特定的进程。如果需要编辑这个配置文件,
一定要先做一个备份。如果该文件被破坏或出现“降级”错误,系统将无法正常启动,到那
时,将不得不进入单用户模式并修正该文件。
i n i t t a b文件所包含的域具有严格的格式。该文件中每个条目的格式为:
i d : r s t a r t : a c t i o n : p r o c e s s
其中,i d域是相应进程的唯一标识。
r s t a r t域所包含的数字表示运行该进程的级别。
a c t i o n域告诉i n i t进程如何对待p r o c e s s所对应的进程。这里可以有很多种动作,但是最常
第28章运行级别脚本319
下载
见的是w a i t和r e s p a w n。w a i t意味着当进程启动后等待它结束。r e s p a w n则意味着如果该进程不
存在,则启动相应的进程,如果它存在,那么只要它一掉下来就立即重新启动它。
p r o c e s s域包含了实际要运行的命令。下面是i n i t t a b文件的一部分。
该文件的第一行是系统缺省的运行级别,这里是级别3,一般都是这样。
以数字1 0到1 6开始的行启动或停止该运行级别所对应的全部运行级别脚本。例如,该文
件中有这样一行:
15:5:wait:/etc/rc.d/rc 5
它的意思是,在运行级别5应该以参数5执行脚本/ e t c / r c . d / r c,即/ e t c / r c . d / r c执行/ e t c / r c . d / r c 5 . d
目录中的所有脚本。
在上述文件的最后一行,在运行级别2、3、4和5,该进程将会始终存在,即使暂时掉下
来,大概也不会超过1 s。这一始终存在的进程是串口t t y S 1上的m i n g e t t y。该命令含有一个参
数,即终端类型为v t 1 0 0。
28.4 运行级别
i n i t进程在系统完全就绪之前所做的最后几项工作之一就是执行缺省运行级别所包含的所
有脚本。该进程是通过/ e t c / r c . d / r c或/ e t c / r c . i n i t来启动这些脚本的。它的作用是首先杀死该运
行级别所包含的进程再启动这些进程。
但是它怎么知道该启动或停止哪些服务呢? r c或r c . i n i t脚本将会使用f o r循环来依次查看相
应运行级别目录中的文件,给每一个链接名以K开头的相应脚本赋予参数s t o p; 给每一个链接
名以S开头的相应脚本赋予参数s t a r t。在运行级别切换时,上述脚本也会完成同样的工作,只
不过根据相应的运行级别来启动或停止对应的脚本。
r c N . d目录中的脚本只是一些链接—真正的脚本保存在其他的目录中。它们通常都放置
320 第五部分高级s h e l l编程技巧
下载
在/ u s r / s b i n / i n i t . d或/ e t c / i n i t . d目录中。
如果是L I N U X系统,那么⋯⋯
/ e t c / r c . d / i n i t . d
在这个目录中含有一些能够启动或停止某一服务的脚本。这些脚本的名字最好能够表示
出它所实现的功能,形如r c . <功能>,其中r c表示运行命令( run command)或运行控制( r u n
c o n t r o l),或者就像某些系统管理员所称的那样“真正关键的”(‘real crucial’)。
下面是这类文件的部分列表。
一般来说, r c . s c r i p t s都应当能够接受这样的参数:
rc.name stop:停止该服务。
rc.name start:启动该服务。
可选的参数包括r e s t a r t和s t a t u s。其他任何参数都应当给出相应的用法说明。注意,可以
手工运行这些脚本。
现在我们已经知道运行级别脚本应当具有什么样的功能,下一步就是把它们放置在相应
的r c N . d目录中。不过在此之前我们先来了解一下系统运行级别。
28.4.1 各种运行级别
系统含有七种运行级别(见表2 8 - 1 )。不同的系统在某些运行级别上稍有差别。
在将一个脚本放置在不同的运行级别目录中之前,首先应当弄清楚打算在哪一个运行级
别启动或停止相应的服务?一旦弄清楚这一点,就可以接着进行下面的步骤了。
表28-1 各个运行级别的用途
运行级别0 启动和停止整个系统
运行级别1 单用户或管理模式
运行级别2 多用户模式;部分网络服务被启动。有些系统将其作为正常运行模式,而不是级别3
运行级别3 正常操作运行模式,启动所有的网络服务
运行级别4 用户定义的模式,可以使用该级别来定制所需要运行的服务
运行级别5 有些U N I X操作系统变体将其作为缺省X - w i n d o w s模式,还有些系统把它作为系统维护模式
运行级别6 重启动
28.4.2 运行级别脚本的格式
r c N . d目录中的脚本都是一些链接,这样是为了省去不必要的副本。这些链接的格式为:
S n n n . s c r i p t _ n a m e
或
K n n n . s c r i p t _ n a m e
其中,
S:代表启动相应的进程
K:代表杀死相应的进程
n n:是0 0至9 9的两位数字,不过在有些系统中是0 0 0至9 9 9三位数字。在不同目录中的链
第28章运行级别脚本321
下载
接应采用同一数字。例如,如果某个服务在r c 3 . d中启动时名为S 4 5 . m y s c r i p t,那么如果希望它
在r c 2 . d中启动,应当使用链接名S 4 5 . m y s c r i p t。
s c r i p t _ n a m e:相应脚本的文件名,根据所在操作系统的不同,它们可能位于下列目录中:
/ u s r / s b i n / i n i t . d
/ e t c / r c . d
/ e t c / i n i t . d
当i n i t 进程调用相应的运行级别脚本时,杀进程按照从高到低的K序号进行,即
K23,myscript K12.named;而启动进程按照从低到高的序号进行。如果使用的是L I N U X系统,
K序号将按照从高到低的顺序执行。
28.4.3 安装运行级别脚本
如果想要安装自己的运行级别脚本,必须:
• 编写该脚本,确保它符合调用标准。
• 确信它能够启动或终止相应的服务。
• 将该脚本放置于(取决于操作系统) / e t c / i n i t . d或/ u s r / s b i n / i n i t . d或/ e t c / r c . d中。
• 在相应的r c N . d目录中按照合理的命名方式创建链接。
下面的脚本能够启动或停止一个名为r c . a u d i t的审核应用程序。该服务运行于级别3、5、4,
停止于级别6、2、1。通过查看r c N . d中的条目,我们发现序号3 5空闲,于是就使用该序号。
实际上,系统并不对使用已占用的序号作任何检查。
下面就是这个脚本。可以看到,该脚本使用了一个简单的c a s e语句来接收s t a r t和s t o p参数。
322 第五部分高级s h e l l编程技巧
下载
如果是LINUX系统,那么⋯⋯
有些L I N U X变体在启动服务时要求创建一个锁文件。如果没有锁文件,在杀死该脚本
时就可能会出现问题。
s t a r t选项将使该审核进程启动相应的审核系统,而s t o p选项将使它终止该系统的运行。当
然,在将自己的运行级别脚本放置在i n i t . d目录中之前,应该首先对该脚本进行测试。
让我们假定该脚本已经通过了测试。它能够正确地启动和停止审核服务。现在我们把该
脚本放置在相应的运行级别目录中。
在本系统中,r c N . d目录位于/ e t c / r c . d目录下,而我的运行级别脚本保存在/ e t c / r c . d / i n i t . d目
录下。如果系统目录结构与上面的不同,那么需要对下面的命令作相应的调整。
我们首先启动该脚本—记住启动脚本所使用的链接名是以S打头的。
我们已经创建了相应的链接。ls -l命令的结果显示该链接指向/ e t c / i n i t . d / r c . a u d i t文件。我
本应该在链接命令中给出全路径,不过没有这个必要。现在我只要进入其他的相关目录( r c 4 . d
和r c 5 . d )使用同样的命令就可以启动其他相应的服务。
如果希望停止某个脚本的运行,可以使用如下命令:
在其他相关目录中,也可以如法炮制,停止相应的审核服务。现在当系统重启动时(运行
级别6 ),它将被停止;在运行级别切换到2或1时也是如此。该服务在运行级别4或5中同样也
会被启动。
28.5 使用inittab来启动应用程序
我们还可以用其他的方法来启动应用程序。可以通过在i n i t t a b文件中加入相应的条目来做
到这一点。在我所管理的有些系统上,我就使用了这种方法,这倒不是因为这些系统中没有
运行级别目录,而是由于我有几个用于系统检查的脚本需要在系统刚刚就绪之后运行。使用
i n i t t a b是实现上述功能的理想途径。
第28章运行级别脚本323
下载
这里我们给出一个例子,我打算在系统运行在级别3时运行我的一个磁盘镜像检查脚本。
首先我确定该脚本能够正确运行,然后对i n i t t a b文件做备份。
$ cp /etc/initab /etc/inittab.bak
接下来编辑i n i t t a b文件,在该文件末尾加入这样一个条目:
保存并退出。
上面的一条意思是:
行首的r c . d i s k c h e c k e r是该进程在运行级别3中的唯一标识。该进程只运行一次。所要运行
的脚本是/ u s r / l o c a l / e t c / r c . d i s k c h e c k e r,所有的输出都被送到控制台。
28.6 启动和停止服务的其他方法
如果不想把/ e t c / i n i t t a b文件弄得过于杂乱,还有其他的方法可以实现启动和停止服务的功
能。大多数系统都含有一个名为r c . l o c a l的文件,一般来说也是位于/ e t c目录下。该脚本文件将
在i n i t t a b和运行级别脚本之后运行。可以在该文件中加入任何命令,或从中调用最习惯用的启
动脚本。
有些系统还在/ b i n目录下(更多的是在/ u s r / s b i n目录下)含有一个名为s h u t d o w n的脚本文件。
可以使用它来关闭某些服务。
28.7 小结
运行级别的确是一个系统管理问题。本章的目的在于:使你了解在系统启动时,如何按
照需求灵活地控制各种服务和脚本的启动。
这还意味着在系统重启动时,能够手工启动和停止某些服务。 |
|