Linux系统服务及其创建详解(service/chkconfig)

我们在日常使用Linux的过程中经常会用到service XXX start/stop/restart等命令对相关系统服务进行控制。(CentOS在版本7之前,CentOS7以及最新版Ubunt都是用systemctl来对系统服务进行管理,当然原来的还是可以用的=。=)

看到公司的产品也是使用service开关系统服务的,查阅了相关资料,特在此总结一下。

part1 守护进程daemon

  翻开任意一本介绍Unix/Linux的书几乎都能找到守护进程相关内容(我是从APUE才真正认识到daemon的),用比较直观的说法来介绍daemon进程就是在后台运行,不受用户终端控制,而且启动后始终在默默运行的服务。

  用百度百科上的一段话来讲就是:

  
守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。
用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,
然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键人的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。
虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。 守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧急信息,都需要以某种方式输出。
Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd 守护进程。

  

  在这里我们需要知道的是我们所需要创建的听起来高大上的“服务”其本质就是一个守护进程,只不过注册为系统服务后该守护进程将会纳入整个系统的总体规划,它将享受自动开机启动,更简单的控制命令等好处,不过也就仅此而已,说到底它还是一个进程,一个守护进程。
 

part2 rc.d (runlevel control directory)运行等级控制目录

  在Linux的/etc/下存在一个非常重要的文件夹rc.d,这个文件夹下有init.d这个重要的文件夹。/etc/下还有rcn.d(n=0-6)这几个文件夹(软连接到/etc/rc.d/rcn.d)。

  目录里面都是一些可执行文件,而且这些文件都是些文本文件,可以用vi打开。

  启动脚本都被放在/etc/rc.d/init.d。这些脚本被ln 命令来连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)

  例如/etc/rc.d/rc2.d 下面的S10network 就是连接到/etc/rc.d/init.d下的network 脚本的。

  不同的运行等级意义如下所示:

    等级0表示:表示关机 
    等级1表示:单用户模式 
    等级2表示:无网络连接的多用户命令行模式 
    等级3表示:有网络连接的多用户命令行模式 
    等级4表示:不可用 
    等级5表示:带图形界面的多用户模式 
    等级6表示:重新启动

  系统从不同运行等级启动时就会找到相应文件夹rc.d/rcn.d中找到开始服务的脚本(以S开头,数字表示优先级)并启动,同理关机时同样使用K开头的软连接关闭服务。

part3 service&chkconfig

  service这个命令我们使用的比较多,也知道是对系统服务进行控制,而chkconfig就是控制service所管理服务的一个命令。

  首先来看看/etc/init.d/文件夹下一个典型的脚本文件样式:

#!/bin/bash  
# chkconfig: - 90 10  
# description: test service  
# Source function library.  
. /etc/rc.d/init.d/functions  
  
# Source networking configuration.  
. /etc/sysconfig/network  
  
RETVAL=0  
  
  
# 调用service xxxd start时执行的逻辑,一般这里就调用我们的程序的启动脚本,带些必要的参数等,以启动我们的进程,然后将pid写到相应的文件中  
start() {  
    echo "started"  
}  
  
#执行service xxxd stop时执行的逻辑,一般这里我们就找到相应的pid文件,然后kill掉相应的进程即可  
stop() {  
    echo "stopped"  
}  
  
# See how we were called.  
case "$1" in  
  start)  
        start  
        ;;  
  stop)  
        stop  
        ;;  
  restart|reload)  
        stop  
        start  
        RETVAL=$?  
        ;;  
  condrestart|try-restart|force-reload)  
        if [ -f /var/lock/subsys/$prog ]; then  
            stop  
            start  
            RETVAL=$?  
        fi  
        ;;  
  status)  
        echo "status"  
        RETVAL=1  
        ;;  
  *)  
        echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"  
        exit 1  
esac  
  
exit $RETVAL  

  里面有不少start/stop/restart相关单词。就算是不懂bash脚本语法应该也能猜到它的用处:负责控制服务的开启与关闭,以及查看服务状态。

当使用service XXXX start/stop等命令的时候其实就是这个脚本在产生作用!

  而创建一个系统服务的关键也就是编写一个这样的脚本(当然得先有一个daemon程序,不过这个并不是本文主题:))而对于这个脚本照样画葫芦好像也不难。

  创建完成之后我们就可以用chkconfig来注册这个service了:

  1.顺序执行以下命令

  2.现在就可以用

   等命令管理服务

  3.chkconfig常用法:


参考:https://blog.csdn.net/lanyang123456/article/details/54695567

   https://blog.csdn.net/a1282379904/article/details/77894102

   https://zhidao.baidu.com/question/140070601.html

猜你喜欢

转载自www.cnblogs.com/J1ac/p/9316888.html