Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1306905
  • 博文数量: 213
  • 博客积分: 7590
  • 博客等级: 少将
  • 技术积分: 2185
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-31 17:31
个人简介

热爱开源,热爱linux

文章分类

全部博文(213)

文章存档

2018年(4)

2017年(1)

2015年(1)

2014年(5)

2013年(2)

2012年(2)

2011年(21)

2010年(82)

2009年(72)

2008年(23)

分类: LINUX

2010-12-20 20:08:46

Ubutun 10.04中的启动项和运行级别

Ubuntu 10.04 中对于运行级别(run level )的配置和一般的Linux 系统不同。一般的Linux/etc/inittab 中配置运行级别和启动项。

而在Ubuntu10.04 中,并没有使用inittab 文件来配置系统启动项和运行级别。所有类似的功能是通过 来实现的。要了解Ubuntu 中的启动项和运行级别的配置,首先需要了解其启动过程。在Ubuntu 的启动过程中,顺序依次为:内核启动init->init 导入/etc/init/rc-sysinit.conf-> 运行/etc/init.d/rc-> 运行/etc/rc[x].d 脚本。

首先来看看/etc/init/rc-sysinit.conf 。在ubuntu10.04 中,/etc/init/rc-sysinit.conf 类似于inittab 文件,默认运行级别是在该文件中配置的(通过设置env DEFAULT_RUNLEVEL )。值得注意的是,在这个文件中有一行代码:if [ -r /etc/inittab ] ,说明在ubuntu 中,用户依旧可以按照自己的习惯,通过inittab 来配置启动服务项和运行级别。

然后来看看/etc/init.d/rc 文件。该文件为系统做了一些初始化的设置。包括PATHumask 等一系列操作。Rc 文件中有这么一些命令

...for s in /etc/rc$runlevel.d/K* ...

...for s in /etc/rc$runlevel.d/S* ...

这说明rc 文件会根据运行级别去执行rc[x].d 中的脚本。

设置好运行级别x 后,可以在对应的/etc/rc[x].d 文件夹中查看对应的运行级别需要启动的服务的符号链接。该文件夹中的大多数文件都以SxxxName 命名的,其中S 表示STARTxxx 表示启动的顺序,Name 表示需要启动的服务。因此,如果需要取消某个服务,只需要将对应启动项的S 改成KSTOP 参数来调用),然后运行update-rc.d 即可。很多rc[x].d 中都有 S99rc.local -> ../init.d/rc.local 这一项,因此可以在rc.local 中配置自定义的启动项。要注意的是,rc.local 中只要有一条语句出错,执行就会退出,造成rc.local 未执行的假象,所以务必保证rc.local 文件中命令的正确性。 (以

Inittab 配置

Inittab 文件以identifier : run_level : action : process 的结构启动项。各字段的含义分别为:

  • identifier :标识符号,最多为4 个字符,用于唯一的标识文件中的每项
  • run_level :系统运行级别,用于指定相应的项适用于哪一个运行级别。如果该字段为空,那么相应的项将适用于所有运行级别。在该字段中,可以同时指定一个或者多个运行级别。各运行级别分别以数字0-6 或字符a-c 表示,且无需对其进行分隔  
  • action :动作关键字,用于制定init 进程或者其他进程对应process 所实施的动作。具体动作包括:
    • boot :在引导过程中执行该进程;不等待进程结束;进程死亡时不重新启动进程
    • bootwait :在引导过程中执行该进程;等待进程结束;进程死亡时不重新启动进程(如果系统的默认运行级别设置为单用户方式,在系统被引导并从单用户方式进入多用户方式时,这些项才被处理;如果系统的默认运行级别设置为多用户方式,在系统引导后,这些项会马上被处理)
    • initdefault :指定系统的默认运行级别。系统启动时,init 会首先查找该项,如果该字段不为空,则init 将据此决定系统最初要进入的运行级别。initrun_level 字段中的最大数字为当前默认的运行级别;如果该字段为空,那么将其解释为“0123456” ,并将其中的最大值“6”init 将要求用户在系统启动时指定一个最初的运行级别 作为默认运行级别;如果该字段不存在,那么
    • off :如果相应的进程正在运行,那么就发出一个警告信号,等待20 秒后,再通过杀死信号强行终止该进程。如果相应的进程不存在,则忽略该项。也可以用来将一条配置失效。
    • once :启动相应的进程;不等待其结束便继续处理/etc/inittab 文件中的下一项;该进程死亡时不重新启动进程;当从一个运行级别进入另一个运行级别时,如果相应的进程已存在,则不重新启动
    • ondemand :与“respawn” 的功能完全相同,但只用于运行级别为a-c 的项
    • powerwaitinit 收到SIGPWR 信号时激活该进程;UPS 电源在电源发生问题时会向该进程发送信号;init 进程会等待该进程至进程终止
    • powerfail :同powerwait ;不等待进程结束
    • ctrlaltdel :当init 接收到SIGINT 信号时,激活对应进程
    • kbrequest :当init 接收到键盘信号时,激活对应进程
    • respawn :如果对应的进程不存在则自动启动进程;如果对应的进程死亡时,init 重新启动该进程;如果对应的进程已存在,则忽略;不等待其结束便继续处理/etc/inittab 文件中的下一项
    • sysinit :在启动或重新启动系统并首先进入单用户时,init 执行该项;如果运行级别为1-6 则不执行该项;在run_level 不指定任何运行级别
    • wait :启动进程并等待结束;然后处理/etc/inittab 文件中的下一项
  • process :要执行的shell 命令。只要符合shell 语法,都可适用于此

update-rc.d 的使用

1 、设置指定启动顺序、指定运行级别的启动项:
update-rc.d
servicestart order > <runlevels
2
、设置在指定运行级中,按指定顺序停止:
update-rc.d
servicestop order > <runlevels
3
、从所有的运行级别中删除指定的启动项:
update-rc.d -f
script-nameremove


下面我在我的机子上实验一下加载一个自启动脚本,脚本如下:

#!/bin/bash

DATE=`date +%Y%m%d`

cat /var/log/messages|grep "restart"|tail -1 >>/var/log/restart_log.$DATE


该脚本用来在每次开机启动之后将重启信息记录到指定日志restart_log.$DATE 里面。
这里将我记载脚本的过程记录一下
首先将上面的脚本backup_restart.sh存到/etc/init.d目录下,并将文件权限使用下列命令改为755

chmod 755 backup_restart.sh

如果你不是root用户,你可能需要使用sudo
然后/rc2.d/里面使用下列命令为上述脚本创建链接

ln -s ../init.d/backup_restart.sh S99backup_restart

重启计算机。reboot
然后你将在/var/log/目录下发现有restart_log.20101221文件,里面记录了你当天重启信息
阅读(1703) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~