首先先看下linux系统开机启动顺序,如下图
对,要解决Linux CentOS 和 Red Hat Linux 系统中设置服务自启动有两种方式,就是从图中圈出的两个步骤下手。
先写好启动脚本或者启动命令,事先保证启动脚本或命令能正常启动服务,然后将脚本路径或启动命令添加至/etc/rc.local文件中,这个方法适合比较简单的shell脚本,比较方便,具体看最后的本次解决方案。
我想使用"service xxxx start"这样的简短命令来管理,就必须注册成为系统服务,那就是在目录 /etc/init.d/ 下,新建一个以服务名为文件名的文件。
如果我们打开目录 /etc/init.d/,看到的文件其实都是服务程序文件,每个文件的内容都大同小异,我们会看到,这里的文件在文件结构上几乎是一样的。几乎每个文件都有 start、stop、restart和status这样的标志,对,我们新建的这个文件也必须具有相同的结构,即可以接受start和stop参数并完成相应的操作。可以这么理解:
service httpd 等价 /etc/rc.d/init.d/httpd
service httpd start 等价 /etc/rc.d/init.d/httpd start
service httpd stop 等价 /etc/rc.d/init.d/httpd stop
所以/etc/init.d/下的这个脚本一般都会有start、stop等方法。这里可以参考mysql公司提供的写好的mysqld,所以我们装mysql的时候一般都会cp mysql.server /etc/init.d/mysql。
在 Linux 中有 7 种运行级别(可在 /etc/inittab 文件设置),每种运行级别分别对应着 /etc/rc[0~6].d 这 7个目录。这 7个目录中,每个目录分别存放着对应运行级别加载时需要关闭或启动的服务,如下图 rc3.d 目录所示,其实每个脚本文件都对应着 /etc/init.d/ 目录下具体的服务,K 开头的脚本文件代表运行级别加载时需要关闭的,S 开头的代表需要执行启动的。
格式:ln -s 目标文件名 连接文件名
例子:cd /etc/rc3.d/
ln -s ../init.d/hdz_service ./S99hdz_service
连接文件名采用“SXX目标文件名”的格式,其中XX一般是一个从1到100的整数,它表示启动优先级,数字越大,优先级越低,比如:服务A的运行要依赖服务B,那A的XX数字就应该大于B的。后跟“目标文件名”是为了一目了然,一看就知道是哪个文件的符号连接。
目录 /etc/rc3.d/ 是系统启动时自动搜索的目录,该目录下的符号连接文件的目标文件,都将被运行,这就是在这个目录建立符号连接的原因——为了开机就运行。
Ps: 服务管理,centos是chkconfig,ubuntu是update-rc.d
1.查看是否已经注册为服务,查看命令:chkconfig --list mysqld(以 mysqld 为例)
通过命令没有查看到,说明还没有添加到启动服务,通过命令 chkconfig --add mysqld 添加即可。
2.给服务可执行的权限:
# chmod 755 mysqld
3.如果需要自启动某些服务,只需使用命令chkconfig <服务名> on 即可,若想关闭,将 on 改为 off。
# chkconfig mysqld on
在默认情况下,chkconfig 会自启动 2345 这四个级别,如果想自定义启动级别可以加上 --leve l选项,后边跟指定的启动级别。
示例:先将 mysqld 服务的所有启动级别关闭,然后使用 --level选项启动自定义级别。
chkconfig --level 2345 mysqld off #关闭2345级别启动。
chkconfig --level 35 mysqld on #指定3、5级别启动。
其中2345是默认启动级别,级别有0-6共7个级别。
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低
ps:这里另外提一句,关于systemctl 命令,是centos7才有的,6和6之前的版本都没有,systemctl 是系统服务管理器命令,它将 service 和 chkconfig 这两个命令组合到一起,也可以设置开机启动,
1、这些链接文件前面为什么会带一个Kxx或者Sxx呢?
是这样的,带K的表示停止(Kill)一个服务,S表示开启(Start)的意思
2、K和S后面带的数字呢?干什么用的
这个我开始的时候还以为是排列起来好看或者数数用呢。后来发现不是的。它的作用是用来排序,就是决定这些脚本执行的顺序,数值小的先执行,数值大的后执行。很多时候这些执行顺序是很重要的,比如要启动Apache服务,就必须先配置网络接口,不然一个没有IP的机子来启动http服务那岂不是很搞笑。。。
3、无意中我发现同一个服务带S的和带K的链接到init.d之后是同一个脚本。我就纳闷了,为什么会是执行同一个脚本呢?
这个时候真是S和K的妙用了,原来S和K并不止是用来看起来分的清楚而已。S给和K还分别给init.d下面的脚本传递了start和stop的参数。哦,是这样的(焕然大悟的样子,呵呵)!这时我才想起来原来曾经无数用过的/etc/rc.d/init.d/network restart命令。原来传S时相当于执行了/etc/rc.d/init.d/xxx start这条命令,当然K就相当于/etc/rc.d/init.d/xxx stop了。