我们在日常使用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