service命令引发的思考

        不知道你有没有思考过,为什么我在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等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值