FreeBSD-rc.d脚本程序-中文手册.pdf
《FreeBSD-rc.d脚本程序-中文手册.pdf》由会员分享,可在线阅读,更多相关《FreeBSD-rc.d脚本程序-中文手册.pdf(16页珍藏版)》请在咨信网上搜索。
1、BSD rc.d脚脚脚本本本编编编程程程实实实战战战Yar TikhiyyarFreeBSD.org版版版权权权 2005,2006 The FreeBSD Project$FreeBSD:doc/zh_CN.GB2312/articles/rc-scripting/article.sgml,v 1.3 2010/01/2013:28:06 loader Exp$FreeBSD 是是是FreeBSD基基基金金金会会会的的的注注注册册册商商商标标标NetBSD是是是NetBSD Foundation的的的注注注册册册商商商标标标。许许许多多多制制制造造造商商商和和和经经经销销销商商商使使使用用用
2、一一一些些些称称称为为为商商商标标标的的的图图图案案案或或或文文文字字字设设设计计计来来来彰彰彰显显显自自自己己己的的的产产产品品品。本本本文文文档档档中中中出出出现现现的的的,为为为FreeBSDProject 所所所知知知晓晓晓的的的商商商标标标,后后后面面面将将将以以以 或或或 符符符号号号来来来标标标注注注。初学者可能会发现,难以通过正式的文档,基于BSD 的rc.d框架,编写一些实际任务的rc.d脚本。本文中,我们采用了一些复杂性不断增加的典型案例,来展示适合每个案例的rc.d特性,并探讨其中的工作原理。这样的实验为大家进一步研究设计有效的rc.d应用程序提供了一些参考点。目目目录录
3、录1 简简简介介介.12 任任任务务务描描描述述述.23 虚虚虚拟拟拟的的的脚脚脚本本本.34 可可可配配配置置置的的的虚虚虚拟拟拟脚脚脚本本本.45 启启启动动动并并并停停停止止止简简简单单单守守守护护护进进进程程程.66 启启启动动动并并并停停停止止止高高高级级级守守守护护护进进进程程程.77 链链链接接接脚脚脚本本本到到到rc.d 框框框架架架.108 给给给予予予rc.d 脚脚脚本本本更更更多多多的的的灵灵灵活活活性性性.139 进进进一一一步步步阅阅阅读读读.141 简简简介介介历史上BSD 曾有过一个单一的启动脚本,/etc/rc。该脚本在系统启动的时候被init(8)程序所引导,
4、并执行所有多用户操作所需求的用户级任务:检查并挂载文件系统,设置网络,启动守护进程,等等。在每个系统中实际的任务清单也并不相同;管理员需要根据需求自定义这样的任务清单。在一些特殊的情况中,还不得不去修改/etc/rc文件,一些真正的黑客乐此不疲。1BSD rc.d脚本编程实战单一脚本启动方法的真正问题是它没有提供对从/etc/rc启动的单个组件的控制。拿一个例子来说吧,/etc/rc不能够重新启动某个单独的守护进程。系统管理员不得不手动找出守护进程,并杀掉它,等待它真正退出后,再通过浏览/etc/rc得到该守护进程的标识,最终输入全部命令来再次启动守护进程。如果重新启动的服务包括不止一个守护进
5、程或需要更多动作的话,该任务将变得更加困难以及容易出错。简而言之,单一脚本在实现我们这样的目的上是不成功的:让系统管理员的生活更轻松。再后来,为了将最重要的一些子系统独立出来,便尝试将部分的内容从/etc/rc分离出来了。最广为人知的例子就是用来启动联网的/etc/netstart文件。它容许从单用户模式访问网络,但由于它的部分代码需要和一些与联网完全无关的动作交互,所以它并没有完美地结合到自启动的进程中。那便是为何/etc/netstart被演变成/etc/work的原因了。后者不再是一个普通的脚本;它包括了庞大的,由/etc/rc在不同的系统启动级别中调用的凌乱的sh(1)函数。然而,当启
6、动任务变得多样化以及久经更改,“类模块化”方法变得比曾经的整体/etc/rc更缓慢费事。由于没有一个干净和易于设计的框架,启动脚本不得不全力更改以满足飞速开发中基于BSD 的操作系统的需求。它逐渐变得明朗并经过许多必要的步骤最终变成一个具有细密性和扩展性的rc系统。BSDrc.d就这样诞生了。Luke Mewburn 和NetBSD 社区是公认的rc.d之父。再之后它被引入到了FreeBSD 中。它的名字引用为系统单独的服务脚本的位置,也就是/etc/rc.d下面的那些脚本。之后我们将学习到更多的rc.d系统的组件并看看单个脚本是如何被调用的。BSDrc.d背后的基本理念是良良良好好好 的模块
7、化和代码重用性。良良良好好好 的模块化意味着每个基本“服务”就象系统守护进程或原始启动任务那样,通过属于它们的可启动该服务的sh(1)脚本,来停止服务,重载服务,检查服务的状态。具体动作由脚本的命令行参数所决定。/etc/rc脚本仍然掌管着系统的启动,但现在它仅仅是使用start参数来一个个调用那些小的脚本。这便于用stop来对运行中的同样的脚本很好地执行停止任务,这是被/etc/rc.shutdown脚本所完成的。看,这是多么好地体现了Unix 的哲学:拥有一组小的专用的工具,每个工具尽可能好地完成自己的任务。代代代码码码重重重用用用 意味着所有的通用操作由/etc/rc.subr中的一些s
8、h(1)函数所实现。现在一个典型的脚本只需要寥寥几行的sh(1)代码。最终,rcorder(8)成为了rc.d框架中重要的一部分,它用来帮助/etc/rc处理小脚本之间的依赖关系并有次序地运行它们。它同样帮助/etc/rc.shutdown做类似的事情,因为正确的关闭次序是相对于启动的次序的。BSDrc.d的设计在 Luke Mewburn 的原文 中有记录,以及rc.d组件也被充分详细地记录在各自的联机手册 中。然而,它可能没能清晰展现给一个rc.d新手,如何将无数的块和片进行关联来为具体的任务创建一个好风格的脚本。因此本文将试着以不同的方式来讲述rc.d。它将展示在某些典型情况中应该使用哪
9、些特性,并阐述了为何如此。注意这并不是一篇how-to 文档,我们的目的不是给出现成的配方,而是在展示一些简单的进入rc.d的范围的门路。本文也不是相关联机手册的替代品。阅读本文时记得同时参考联机手册以获取更完整正规的文档。理解本文需要一些先决条件。首先,你需要熟悉sh(1)脚本编程语言以掌握rc.d,还有,你需要知道系统是如何执行用户级的启动和停止任务,这些在rc(8)中都有说明。本文关注的是rc.d的FreeBSD 分支。不过,它可能对NetBSD 的开发者也同样有用,因为BSDrc.d的两个分支不只是共享了同样的设计,还保留了对脚本编写者都可见的类似观点。2 任任任务务务描描描述述述在开
10、始打开$EDITOR(编辑器)之前进行小小的思考不是坏事。为了给一个系统服务写一个“听话的”rc.d脚本,我们首先应该能回答以下问题:该服务是必须性的还是可选性的?脚本将为单个程序服务,如一个守护进程,还是执行更复杂的动作?2BSD rc.d脚本编程实战我们的服务依赖哪些服务?反过来哪些服务依赖我们的服务?从下面的例子中我们将看到,为什么说知道这些问题的答案是很重要的。3 虚虚虚拟拟拟的的的脚脚脚本本本下面的脚本是用来在每次系统启动时发出一个信息:#!/bin/sh./etc/rc.subrname=dummystart_cmd=$name_startstop_cmd=:dummy_start
11、()echo Nothing started.load_rc_config$namerun_rc_command$1需要注意的是:一个解释性的脚本应该以一行魔幻的“shebang”行开头。该行指定了脚本的解析程序。由于shebang行的作用,假如再有可执行位的设置,脚本就能象一个二进制程序一样被精确地调用执行。(请参考chmod(1)。)例如,一个系统管理员可以从命令行手动运行我们的脚本:#/etc/rc.d/dummy start注注注意意意:为了使rc.d框架正确地管理脚本,它的脚本需要用sh(1)语言编写。如果你的某个服务或port 套件使用了二进制控制程序或是用其它语言编写的例程,请将
12、其组件安装到/usr/sbin(相对于系统)或/usr/local/sbin(相对于ports),然后从合适的rc.d目录的某个sh(1)脚本调用它。提提提示示示:如果你想知道为什么rc.d脚本必须用sh(1)语言编写的细节,先看下/etc/rc是如何依靠run_rc_script调用它们,然后再去学习/etc/rc.subr下run_rc_script的相关实现。在/etc/rc.subr下,有许多定义过的sh(1)函数可供每个rc.d脚本使用。这些函数在rc.subr(8)中都有说明。尽管理论上可以完全不使用rc.subr(8)来编写一个rc.d脚本,但它的函数已经证明了它真的很方便,并且
13、能使任务更加的简单。所以所有人在编写rc.d脚本时都会求助于rc.subr(8)也不足为奇了。当然我们也不例外。一个rc.d脚本在其调用rc.subr(8)函数之前必须先“source”/etc/rc.subr(用“.”将其包含进去),而使sh(1)程序有机会来获悉那些函数。首选风格是在脚本的最开始source/etc/rc.subr文件。注注注意意意:某些有用的与联网有关的函数由另一个被包含进来的文件提供,/etc/network.subr文件。3BSD rc.d脚本编程实战强制的变量name指定我们脚本的名字。这是rc.subr(8)所强调的。也就是,每个rc.d脚本在调用rc.subr(
14、8)的函数之前必须设置name变量。现在是时候来为我们的脚本一次性选择一个独一无二的名字了。在编写这个脚本的时我们将在许多地方用到它。在开始之前,我们来给脚本文件也取个相同的名字。注注注意意意:当前的rc.d脚本风格是把值放在双引号中来给变量赋值。请记住这只是个风格问题,可能并不总是这样。你可以在只是简单的并不包括sh(1)元字符的词句中放心地省略掉引号,而在某些情况下你将需要使用单引号以防止sh(1)对任何的变量的解释。程序员是可以灵巧地由风格惯例获悉其语法以及使用的。rc.subr(8)背后主要的构思是rc.d脚本提供处理程序,或者方法,来让rc.subr(8)调用。特别是,start,s
15、top,以及其它的rc.d脚本参数都是这样被处理的。方法是存储在一个以argument_cmd形式命名的变量中的sh(1)表达式,该argument对应着脚本命令行中所特别指定的参数。我们稍后将看到rc.subr(8)是如何为标准参数提供默认方法的。注注注意意意:为了让rc.d中的代码更加统一,常见的是在任何适合的地方都使用$name形式。这样一来,可以轻松地将一些代码从一个脚本拷贝到另一个中使用。我们应谨记rc.subr(8)为标准参数提供了默认的方法。因此,如果希望它什么都不做的话,我们必须使用无操作的sh(1)表达式来改写标准的方法。比较复杂的方法主体可以用函数来实现。在能够保证函数名有
16、意义的情况下,这是个很不错的想法。重重重要要要:强烈推荐给我们脚本中所定义的所有函数名都添加类似$name这样的前缀,以使它们永远不会和rc.subr(8)或其它公用包含文件中的函数冲突。这是在请求rc.subr(8)载入rc.conf(5)变量。尽管我们这个脚本中使用的变量并没有被其它地方使用,但由于rc.subr(8)自身所控制着的rc.conf(5)变量存在的原因,仍然推荐脚本去装载rc.conf(5)。通常这是rc.d脚本的最后一个命令。它调用rc.subr(8)体系使用我们脚本所提供的变量和方法来执行相应的请求动作。4 可可可配配配置置置的的的虚虚虚拟拟拟脚脚脚本本本现在我们来给我们
17、的虚拟脚本增加一些控制参数吧。正如你所知,rc.d脚本是由rc.conf(5)所控制的。幸运的是,rc.subr(8)隐藏了所有复杂化的东西。下面这个脚本使用rc.conf(5)通过rc.subr(8)来查看它是否在第一个地方被启用,并获取一条信息在启动时显示。事实上这两个任务是相互独立的。一方面,rc.d脚本要能够支持启动和禁用它的服务。另一方面,rc.d脚本必须能具备配置信息变量。我们将通过下面同一脚本来演示这两方面的内容:#!/bin/sh./etc/rc.subr4BSD rc.d脚本编程实战name=dummyrcvar=set_rcvarstart_cmd=$name_starts
18、top_cmd=:load_rc_config$nameeval$rcvar=$rcvar:-NOdummy_msg=$dummy_msg:-Nothing started.dummy_start()echo$dummy_msgrun_rc_command$1在这个样例中改变了什么?变量rcvar指定了ON/OFF 开关变量的名字。包含来自rc.subr(8)中变量名是为了调用不同操作系统所采用的不同规定的set_rcvar。也就是说,FreeBSD 坚持使用$name_enable样式而NetBSD的rc.conf(5)中使用的只是$name变量的形式。例如,我们在FreeBSD 中使用du
19、mmy_enable来控制我们的脚本而在NetBSD 中使用dummy来控制。现在load_rc_config在任何rc.conf(5)变量被访问之前就在脚本中被预先调用。注注注意意意:检查rc.d脚本时,切记sh(1)会把函数延迟到其被调用时才对其中的表达式进行求值运算。因此尽可能晚地在run_rc_command之前调用load_rc_config,以及仍然访问从方法函数输出到run_rc_command的rc.conf(5)变量并不是一个错误。这是因为方法函数将在load_rc_config之之之后后后,被调用的run_rc_command调用。如果自身设置了rcvar,但指示开关变量却
20、未被设置,那么run_rc_command将发出一个警告。如果你的rc.d脚本是为基本系统所用的,你应当在/etc/defaults/rc.conf中给开关变量添加一个默认的设置并将其标注在rc.conf(5)中。否则的话你的脚本应该给开关变量提供一个默认设置。范例中演示了一个可移植接近于后者情况的案例。注注注意意意:你可以通过将开关变量设置为ON 来使rc.subr(8)有效,使用one或force为脚本的参数加前缀,如onestart或forcestop这样,会忽略其当前的设置。切记force在我们下面要提到的情况下有额外的危险后果,那就是当用one改写了ON/OFF 开关变量。例如,假定
21、dummy_enable是OFF的,而下面的命令将忽略系统设置而强行运行start方法:#/etc/rc.d/dummy onestart现在启动时显示的信息不再是硬编码在脚本中的了。它是由一个命名为dummy_msg的rc.conf(5)变量所指定的。这就是rc.conf(5)变量如何来控制rc.d脚本的一个小例子。重重重要要要:我们的脚本所独占使用的所有rc.conf(5)变量名,都必须具有同样的前缀:$name。例如:dummy_mode,dummy_state_file,等等。5BSD rc.d脚本编程实战注注注意意意:当可以内部使用一个简短的名字时,如msg这样,为我们的脚本所引进的
22、全部的共用名添加唯一的前缀$name,能够避免我们与rc.subr(8)命名空间冲突的可能。只要一个rc.conf(5)变量与其内部等同值是相同的,我们就能够使用一个更加兼容的表达式来设置默认值::$dummy_msg:=Nothing started.尽管目前的风格是使用了更详细的形式。通常,基本系统的rc.d脚本不需要为它们的rc.conf(5)变量提供默认值,因为默认值应该是在/etc/defaults/rc.conf设置过了。但另一方面,为ports 所用的rc.d脚本应提供如范例所示的默认设置。这里我们使用dummy_msg来实际地控制我们的脚本,即,发一个变量信息。5 启启启动动动
23、并并并停停停止止止简简简单单单守守守护护护进进进程程程我们早先说过rc.subr(8)是能够提供默认方法的。显然,这些默认方法并不是太通用的。它们都是适用于大多数情况下来启动和停止一个简单的守护进程况。我们来假设现在需要为一个叫做mumbled的守护进程编写一个rc.d脚本,在这里:/para#!/bin/sh./etc/rc.subrname=mumbledrcvar=set_rcvarcommand=/usr/sbin/$nameload_rc_config$namerun_rc_command$1感到很简单吧,不是么?我们来检查下我们这个小脚本。只需要注意下面的这些新知识点:这个comm
24、and变量对于rc.subr(8)来说是有意义的。当它被设置时,rc.subr(8)将根据提供传统守护进程的情形而生效。特别是,将为这些参数提供默认的方法:start,stop,restart,poll,以及status。该守护进程将会由运行中的$command配合由$mumbled_flags所指定的命令行标帜来启动。因此,对默认的start方法来说,所有的输入数据在我们脚本变量集合中都可用。与start不同的是,其他方法可能需要与进程启动相关的额外信息。举个例子,stop必须知道进程的PID 号来终结进程。在目前的情况中,rc.subr(8)将扫描全部进程的清单,查找一个名字等同于$pro
25、cname的进程。后者是另一个对rc.subr(8)有意义的变量,并且默认它的值跟command一样。换而言之,当我们给command设置值后,procname实际上也设置了同样的值。这启动我们的脚本来杀死守护进程并检查它是否正在第一个位置运行。注注注意意意:某些程序实际上是可执行的脚本。系统启动脚本的解释器以传递脚本名为命令行参数的形式来运行脚本。然后被映射到进程列表中,这会使rc.subr(8)迷惑。因此,当$command是一个脚本的时,你应该额外地设置command_interpreter来让rc.subr(8)知晓进程的实际名字。6BSD rc.d脚本编程实战对每个rc.d脚本而言,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FreeBSD rc 脚本 程序 中文 手册
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。