本节我们先学习源码包服务的启动管理,再来学习源码包服务的自启动管理,最后学习如何让源码包服务被系统服务管理命令识别。
源码包服务的启动管理
源码包服务中所有的文件都会安装到指定目录当中,并且没有任何垃圾文件产生(Linux 的特性),所以服务的管理脚本程序也会安装到指定目录中。源码包服务的启动管理方式就是在服务的安装目录中找到管理脚本,然后执行这个脚本。
问题来了,每个服务的启动脚本都是不一样的,我们怎么确定每个服务的启动脚本呢?还记得在安装源码包服务时,我们强调需要査看每个服务的说明文档吗(一般是 INSTALL 或 READEM)?在这个说明文档中会明确地告诉大家服务的启动脚本是哪个文件。
我们用 apache 服务来举例。一般 apache 服务的安装位置是 /usr/local/apache2/ 目录,那么 apache 服务的启动脚本就是 /usr/local/apache2/bin/apachectl 文件(查询 apache 说明文档得知)。启动命令如下:
[root@localhost ~]# /usr/local/apache2/bin/apachectl start|stop|restart|... #源码包服务的启动管理
例如:
[root@localhost ~]# /usr/local/apache2/bin/apachectl start #会启动源码包安装的apache服务
注意,不管是源码包安装的 apache,还是 RPM 包默认安装的 apache,虽然在一台服务器中都可以安装,但是只能启动一因为它们都会占用 80 端口。
源码包服务的启动方法就这一种,比 RPM 包默认安装的服务要简单一些。
源码包服务的自启动管理
源码包服务的白启动管理也不能依靠系统的服务管理命令,而只能把标准启动命令写入 /etc/rc.d/rc.local 文件中。系统在启动过程中读取 /etc/rc.d/rc.local 文件时,就会调用源码包服务的启动脚本,从而让该服务开机自启动。命令如下:
[root@localhost ~]# vi /etc/rc.d/rc.local #修改自启动文件 #!/bin/sh #This script will be executed *after* all the other init scripts. #You can put your own initialization stuff in here if you don11 #want to do the full Sys V style init stuff. touch /var/lock/subsys/local /usr/local/apache2/bin/apachectl start #加入源码包服务的标准启动命令,保存退出,源码包安装的apache服务就被设为自启动了
让源码包服务被服务管理命令识别
在默认情况下,源码包服务是不能被系统的服务管理命令所识别和管理的,但是如果我们做一些设定,则也是可以让源码包服务被系统的服务管理命令所识别和管理的。不过笔者并不推荐大家这样做,因为这会让本来区别很明确的源码包服务和 RPM 包服务变得容易混淆,不利于系统维护和管理。
我们做一个实验,看看如何把源码包安装的 apache 服务变为和 RPM 包默认安装的 apache 服务一样,可以被 service、chkconfig、ntsysv 命令所识别。实验如下:
1) 卸载RPM包默认安装的apache服务
[root@localhost ~]# yum -y remove httpd #卸载RPM包默认安装的apache服务,避免对实验产生影响(在生产服务器上慎用yum卸载,因为这有可能造成服务器崩溃) [root@localhost ~]# service httpd start httpd:未被识别的服务 #因为服务被卸载,所以service命令不能识别httpd服务
2) 安装源码包的apache服务,并启动
#安装源码包的apache服务 [root@localhost ~]# /usr/local/apache2/bin/apachect1 start [root@localhost ~]# netstat -tlun | grep 80 tcp 0 0 :::80 :::* LISTEN #启动源码包安装的apache服务,查看端口确定已经启动
3) 让源码包安装的apache服务能被service命令管理启动
[root@localhost ~]# ln -s /usr/local/apache2/bin/apachectl /etc/±nit.d/apache #service命令其实只是在/etc/init.d/目录中查找是否有服务的启动脚本,所以我们只需要做一个软链接,把源码包的启动脚本链接到/etc/init.d/目录中,就能被service命令所管理了。为了照顾大家的习惯,我把软链接文件命名为apache,注意这不是RPM包默认安装的apache服务 [root@localhost ~]# service apache restart #虽然RPM包默认安装的apache服务被卸载了,但是service命令也能够生效
4) 让源码包安装的apache服务能被chkconfig命令管理自启动
[root@localhost ~]# vi /etc/init.d/apache #修改源码包安装的apache服务的启动脚本(注意此文件是软链接,所以修改的还是源码包启动脚本) #!/bin/sh # #chkconfig: 35 86 76 #指定httpd脚本可以被chkconfig命令所管理 #格式是:chkconfig:运行级别 启动顺序 关闭顺序 #这里我们让apache服务在3和5级别中能被chkconfig命令所管理,启动顺序是S86,关闭顺序是K76 #(自定顺序,不要和系统中已有的启动顺序冲突) #description: source package apache #说明,内容随意 #以上两句话必须加入,才能被chkconfig命令所识别 ...省略部分输出... [root@localhost ~]# chkconfig --add apache #让chkconfig命令能够管理源码包安装的apache服务 [root01ocalhost ~]# chkconfig --list | grep apache apache 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 #很神奇吧,虽然RPM包默认安装的apache服务被删除了,但是chkconfig命令可以管理源码包安装的tapache服务
5) 让ntsysv命令可以管理源码包安装的apache服务
#ntsysv 命令其实和 chkconfig 命令使用同样的管理机制,也就是说,ntsysv 已经可以进行源码包安装 apache 服务的自启动管理了,如图 1 所示
图 1 ntsysv 命令识别 apache
总结一下,如果想让源码包服务被service命令所识别和管理,则只需做一个软链接把启动脚本链接到 /etc/init.d/ 目录中即可。要想让源码包服务被 chkconfig 命令所是被,除了需要把服务的启动脚本链接到 /etc/init.d/ 目录中,还要修改这个启动脚本,在启动脚本的开头加入如下内容:
#chkconfig:运行级别 启动顺序 关闭 #description:说明
然后需要使用"chkconfig--add 服务名"的方式把服务加入 chkconfig 命令的管理中。命令格式如下:
[root@localhost ~]# chkconfig [选项][服务名]
选项:
-add:把服务加入 chkconfig 命令的管理中;
-del:把服务从 chkconfig 命令的管理中删除;
例如:
[root@localhost ~]# chkconfig -del httpd #把apache服务从chkconfig命令的管理中删除