0 前言    

    最近做项目,要检测某个系统服务是否配置为开机启动。因此,对涉及的内容在此做一些整理。主要以ubuntu10.04为例进行分析。

1 Linux运行级别

    参考资料[1]告诉我们,Linux有7个运行级别,使用runlevel命令可以查看当前的运行级别和之前的运行级别。如下图所示。


ubuntu MySQL 启动日志存储位置_参考资料

图1.1 查看运行级别

    由上图可见,可见Ubuntu系统默认的运行级别是2,之前的运行级别是N。那是因为刚启动系统,还没有切换过运行级别,因此使用N表示没有!另外,我在Omapl138开发板上进行测试的时候,发现它的默认的运行级别是5。也就是说,不同的系统,可以配置不同的默认级别。但是0、6这个两个级别不能设为默认值,具体参见参考资料[1]。

    而要切换到特定的运行级别,使用init命令。例如“init 0”和“init 6”分别实现关机和重启系统!如下图所示。


ubuntu MySQL 启动日志存储位置_参考资料_02

图1.2 关机

    对于参考资料[1]提到的/etc/rc.d目录,我使用的Ubuntu10.04和广州创电子科技有限公司Omapl138开发板配置的Linux系统都没有,而实际上,rc0.d、rc1.d、rc2.d...rc6.d、rc.local、init.d都在/etc目录中!因此在阅读过程中,自动将rc.d忽略即可(根据参考资料[8][9][10]的提示可知,/etc/rc.d是Redhat版本的系统中的目录,由此可见,虽然都是Linux系统,但是各个发行版的目录结构都是有差异的)。

    最后,关于运行等级,可以查看系统的/etc/inittab文件(Ubuntu10.04没有这个文件!),详见参考资料[8]。

2 /etc/rc?.d目录实验

    参考资料[1]说,当Linux系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件(rcN.d中的都是链接文件),对于以K开头的文件,系统将终止对应的服务,对于以S开头的文件,系统将启动对应的服务。那么,如何检验呢?

    根据参考资料[2]的提示,我们可以在/etc/init.d目录中建一个shell脚本,这里我将其命名为init_test, 可执行。主要的目的是在标准输出上显示一句话,内容如下图所示:


ubuntu MySQL 启动日志存储位置_ubuntu_03

图2.1

    再根据参考资料[2]的提示,在/etc/rc5.d目录中创建一个到/etc/init.d/init_test的软链接,名为S88init_test(以S开头,88为随便写的),如下图所示:


ubuntu MySQL 启动日志存储位置_linux_04

图2.2

    准备好之后,就使用init命令,将系统的运行级别切换到5(原来的运行级别为2),如下图:


ubuntu MySQL 启动日志存储位置_运行级别_05

图2.3

    由上图可见,什么反应都没有!那么,是不是参考资料[1]的说法有误呢?

    不到黄河不死心,将/etc/init.d/init_test的内容改为:


ubuntu MySQL 启动日志存储位置_参考资料_06

图2.4

    上面内容的主要目的是在/home目录中创建一个文件file_create_by_init_test,并且往里面写“I am /etc/init.d/init_test”。

    下面进行测试,先将运行级别切换到2,然后再切换到5,如下图:


ubuntu MySQL 启动日志存储位置_参考资料_07

图2.5

    然查看/home目录下是否创建了文件file_create_by_init_test,如下图:


ubuntu MySQL 启动日志存储位置_运行级别_08

图2.6

    由上图可见,果真在/home目录下创建了一个file-create_by_init_test文件!

    实验是检验真理的唯一标准,经过实验检验,参考资料[1]说的没有错。但是有一点要指出的是,我使用的Ubuntu系统,没有参考资料[1][2]中所说的/etc/rc.d目录。

3 检测开机启动的服务

3.1 chkconfig

    根据参考资料[1]的提示,我们可以使用chkconfig工具来检测系统服务,例如:


ubuntu MySQL 启动日志存储位置_参考资料_09

图3.1

    需要注意的是,chkconfig并不是系统默认配置的,需要自己下载安装。

3.2 ps

    使用ps命令可以输出当前运行的进程,结合grep命令,可以确定某个程序是否正在运行中,如下图所示,查看tftp服务是否已经启动:


ubuntu MySQL 启动日志存储位置_服务器_10

图3.2

3.3 检测/etc/rc?.d

    网上有人提出,使用检查rc?.d目录的方式来查看开机启动的服务,尝试如下:


ubuntu MySQL 启动日志存储位置_ubuntu_11

图3.3

    由上图可见,在rc?.d目录中并没有找到tftp的有关信息,但是使用3.1小节的方式却可以发现当前tftp服务是开启的,如下图:


ubuntu MySQL 启动日志存储位置_服务器_12

图3.4

    由此可见,使用检测/etc/rc?.d的方式并不可行。

参考资料

[1]Linux系统有7个运行级别(runlevel)

[2]linux自定义开机启动服务和chkconfig使用方法

[3]Linux开机启动十步骤

[4]Linux开机启动服务

[5]linux系统服务

[6]Linux系统服务及其配置 

[7]Linux下如何将服务注册为系统服务

[8]Ubuntu中的inittab文件

[9]探讨ubuntu启动过程,init进程启动后为什么没有inittab文件?

[10]OS:Ubuntu 10.04 LTS 启动过程

[11]ubuntu 10.04 启动过程