不知道你有没有思考过,为什么我在linux上安装了tomcat之后的启动方式是“sh startup.sh”,而linux网络服务的启动方式却是"service network start",那我的tomcat能不能使用"service tomcat start"来启动呢?你可以试一下,结果是不能,为什么有的能有的不能呢?我不想浑浑噩噩的去死记硬背哪些可以使用service命令,哪些不可以使用service命令,因此我的好奇心也会驱使我去一探究竟,带着这些疑团我们来看看service命令是怎么工作的吧。
通过service命令可以启动的服务在/etc/init.d/这个目录下:
[root@node78 init.d]# pwd /etc/init.d [root@node78 init.d]# ll total 44 -rw-r--r--. 1 root root 17500 May 3 2017 functions -rwxr-xr-x. 1 root root 1308 Dec 14 10:10 keepalived -rwxr-xr-x. 1 root root 4334 May 3 2017 netconsole -rwxr-xr-x. 1 root root 7293 May 3 2017 network -rw-r--r--. 1 root root 1160 Aug 5 14:38 README
看到了吧,之所以能通过service命令来启动网络服务,就是因为network在/etc/init.d/文件夹下面。而/etc/init.d/是/etc/rc.d/init.d的软连接,也就是windows里面的快捷方式了,它们俩是一样的。/etc/rc.d这个目录对linux运行来说是很重要的一个目录,所谓"rc.d"就是“run control directory”的意思,/etc/rc.d/这个linux运行控制目录的子目录在/etc/目录下都有软连接,并不止init.d这一个目录:
[root@node78 /etc]#ll|grep rc.d/ lrwxrwxrwx. 1 root root 11 Dec 11 05:50 init.d -> rc.d/init.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc0.d -> rc.d/rc0.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc1.d -> rc.d/rc1.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc2.d -> rc.d/rc2.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc3.d -> rc.d/rc3.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc4.d -> rc.d/rc4.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc5.d -> rc.d/rc5.d lrwxrwxrwx. 1 root root 10 Dec 11 05:50 rc6.d -> rc.d/rc6.d lrwxrwxrwx. 1 root root 13 Dec 11 05:51 rc.local -> rc.d/rc.local
我们打开/etc目录,都会看到很多的目录啊,文件啊,其实有很多都是软连接了,之所以有这么多的软连接,主要是为了兼容Linux和unix。init.d目录我们已经说过了,剩下的rc[0-6].d又有何用?我们前边说过了linux系统的运行级别runlevel也是0-6总共7个运行级别,这里的rc0.d就是对应的0这个运行级别,其他的以此类推,可能你还不明白,那我再说的像人话一点吧,举个例子来说,rc3.d这个目录就是用来配置当linux以3这个运行级别(命令行方式)启动时要开机启动哪些程序,要开机关闭哪些程序,进入这个目录看一下结果吧:
[root@node78 /etc/rc3.d]#ll total 0 lrwxrwxrwx. 1 root root 20 Dec 11 05:51 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 17 Dec 11 05:51 S10network -> ../init.d/network
看一下这边两个文件的命名格式"K/S+数字+服务名":
K/S:以K开头的,就是kill的意思,表示linux启动的时候不会启动netconsole这个服务,而以S开头就是start的意思了,表示开机自己启动
数字:这里的数字表示启动或者关闭的顺序,数字越小优先级越高。
服务名:我们看到这两个文件又是/etc/init.d/目录下相应文件的软连接,也就是"/etc/rc3.d/S10network"->"/etc/init.d/network"->"/etc/rc.d/init.d/network",这些软连接就像食物链一样,搞得人晕晕乎乎的啊。
总结一下:
1.如果想使用service来控制某个服务A,那么A服务的控制脚本需要放在/etc/init.d/目录下
2.如果想要在某个运行级别x(x代表运行级别0-6)下做到开机自启动某个服务A,需要在对应的/etc/rcx.d目录下建立符合"K/S+数字+服务名"命名格式的文件,这个文件是/etc/init.d/目录下A服务的软连接。
3.有人问,我安装了tomcat之后,tomcat的那个所谓的“控制脚本”在哪?很遗憾的告诉你,没有,控制脚本是用来控制对应服务的启动与停止的,需要遵循约定,有的软件自带,有的软件不自带,如果你想要tomcat的控制脚本,需要自己写,不过为了不让大家太盲目,我这里贴出一个其他软件的控制脚本,其实也都差不多,你可以看着下面的格式自己改一下,尝试尝试,在尝试摸索中进步,是一种很好很快乐的事情,如果有机会我再写相关文章介绍如何写这个控制脚本吧,下面贴的这个脚本是一个做高可用的软件keepalived的控制脚本,仅做格式参考:
#!/bin/sh # # Startup script for the Keepalived daemon # # processname: keepalived # pidfile: /var/run/keepalived.pid # config: /etc/keepalived/keepalived.conf # chkconfig: - 21 79 # description: Start and stop Keepalived # Source function library . /etc/rc.d/init.d/functions # Source configuration file (we set KEEPALIVED_OPTIONS there) . /etc/sysconfig/keepalived RETVAL=0 prog="keepalived" start() { echo -n $"Starting $prog: " daemon keepalived ${KEEPALIVED_OPTIONS} RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog } stop() { echo -n $"Stopping $prog: " killproc keepalived RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog } reload() { echo -n $"Reloading $prog: " killproc keepalived -1 RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/$prog ]; then stop start fi ;; status) status keepalived RETVAL=$? ;; *) echo "Usage: $0 {start|stop|reload|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL
4.看了上面的脚本之后,我们是不是明白了我们之所以可以在"service xxx "后面传递“start/stop/restart”的参数,就是因为在脚本里面已经定义了,而这些传参方式针对大多数可以通过service来控制的软件都是通用的,所以我说这个控制脚本的编写是有约定的,约定了什么就是约定了传参的内容需要包含start stop等。