linux启动脚本学习
一、init和运行级别
接触过linux的朋友应该都了解到,传统的init定义了7个运行级(run level),例如0级是关闭系统、2级进入是多用户字符界面、5级是进入图形界面等等。
/etc/inittab文件规定了系统进入到每一个运行级时需要运行的命令,在机器引导时,init从运行级别0级开始,一级一级地往上运行到在/etc/inittab文件中所设置的默认运行级别。
修改系统的默认运行级别:
#vi /etc/inittab //编辑inittab文件
找到以下字段
id:5:initdefault: //可见默认的运行级为5,即在系统引导时直接进入图形界面,我们可以通过修改这个数字自定义系统引导的默认运行级
二、认识服务启动脚本
本人博客前面的一篇文章曾经介绍过将如何编写和配置一个新的服务启动脚本(详细见
linux下将某个应用(软件)配置成系统服务),简单带过了启动脚本这个概念,这里再次详细说明一下。
/etc/init.d/里存放了所有的启动脚本,我们平时可以通过/etc/init.d/脚本名 启动模式 来启动某个应用。
例如输入命令“/etc/init.d/smb start”来启动smb服务。
如果是在RedHat系统下,还可以通过service smb start来启动某个服务。
尽管/etc/init.d目录中的脚本可以启动和停止各个服务,但在系统引导时,init并不是直接在/etc/init.d目录下找各个服务的启动脚本,而是在/etc/rc.d/目录下查找,该目录包含rc0.d、rc1.d等分别代表不同的init启动级别的子目录,各个子目录中包含对应启动级别的启动脚本,如图所示:
接着来看看这些rcx.d的目录下所包含的内容,内容全是一些符号链接,链接到上一级init目录中的脚本上。
这些符号链接名称都以S或K开头,后面跟一个数字以及该脚本所控制的服务名,例如S10network。
当init从低的运行级向高的运行级过渡时,它按照数字递增的顺序运行所有以S开头的脚本,S=start,即启动脚本对应的服务;K=kill,即杀死脚本对应服务
首先来看系统默认的运行级别init5(即开机直接引导至图形化界面)对应的脚本目录rc5.d,如图:
rc5.d目录里既有K脚本,也有S脚本,当系统启动时,init会按这些符号链接的数字顺序启动所有S开通的脚本,当系统关闭时,init也会按顺序关闭所有脚本对应的应用。
可以看到这些符号链接实际上全是指向了init.d目录下启动脚本
现在回头看看rc0.d(即关闭系统)目录下的内容:
可以看到rc0.d目录下全部K开头的符号链接,当我们输入命令init 0时所有系统服务都会被关闭。
其他rcx.d目录内容大同小异,都是一些指向启动脚本的符号链接,只是根据不同的运行级别放置了不同的启动脚本符号链接。
三、自定义启动服务的顺序
前面介绍到rcx.d目录下指向启动脚本的符号链接是由K或S+数字+服务名 所组成,中间这个数字十分重要,系统启动时按照这个数字递增执行所有S开头的脚本,系统关闭时按照这个数字递减执行所有K开头的脚本。
知道了这点,我们就可以根据自己的需求控制启动服务的顺序。
如何自定义符号链接?
启动脚本:
#ln -s /etc/init.d/smb S60smb //重新定义smb服务的脚本启动顺序
如图:
关闭脚本:
#ln -s /etc/init.d/smb K60smb //和启动脚本基本一样,S改成K