Linux服务那些事

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SonOfWind0311/article/details/87873989

写这个的起因是遇到了一个问题,需要写个watchdog监控服务状态,结果发现kill掉进程时服务状态是

Active: active (exited) since Wed 2019-02-20 10:27:52 CST; 5min ago

通过systemctl status service-name判断服务状态任务服务状态是running,在网上搜到了几个帖子:
What does status “active (exited)” mean for a (custom) service?
systemctl is-active output wrong state
Service Active but (exited)
发现问题根因是通过/etc/init.d/service-name方式定义服务是一种比较老的方式,系统升级为使用/usr/lib/systemd/system/service-name.service方式定义服务后,使用systemd-sysv-generator生成服务描述,自动生成的服务描述中RemainAfterExit=true,导致上述问题发生。
问题定位之后,也对服务定义有了一些了解,梳理如下:

服务启动

以下内容整理自 Linux服务启动
简单来说,系统通过启动一个叫init的用户级程序,完成引导进程,它是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level),它决定了系统启动之后运行于什么级别(这个级别从0到6 ,具有不同的功能,级别的详细定义可以参考 Linux服务启动)。
在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行,然后执行/etc/rc.d目录下相应级别目录下的脚本启动服务。例如级别0对应目录/etc/rc.d/rc0.d。

  • 这些链接文件前面为什么会带一个Kxx或者Sxx?
    带K的表示停止(Kill)一个服务,S表示开启(Start)一个服务。
  • K和S后面带的数字是什么含义?
    它的作用是用来排序,决定这些脚本执行的顺序,数值小的先执行,数值大的后执行。
  • /etc/init.d和/etc/rc.d/init.d什么关系?
    /etc/init.d 是 指向 /etc/rc.d/init.d 的软链接
  • service xxx start来启动某个服务,它背后究竟执行了什么?
    service的绝对路径为/sbin/service ,它其实是一个很普通的shell脚本
  	#!/bin/sh
  	
  	. /etc/init.d/functions
  	
  	VERSION="$(basename $0) ver. 1.1"
  	USAGE="Usage: $(basename $0) < option > | --status-all | \
  	[ service_name [ command | --full-restart ] ]"
  	SERVICEDIR="/etc/init.d"
  	ACTIONDIR="/usr/libexec/initscripts/legacy-actions"
  	SERVICE=
  	ACTION=
  	OPTIONS=
  	
  	if [ $# -eq 0 ]; then
  	   echo "${USAGE}" >&2
  	   exit 1
  	fi
  	......
  	if [ -f "${SERVICEDIR}/${SERVICE}" ]; then
  		env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
  	else
  		echo $"${SERVICE}: unrecognized service" >&2
  		exit 1
  	fi

简单来说,service xxx start来启动某个服务就是相当于调用了/etc/init.d/xxx start。

服务定义

如上所说启动服务就相当于调用脚本,但服务脚本除了是个脚本之外,它还有一些其他的功能,比如定义服务依赖,定义启动级别等等。使用install_initd安装服务时会解析脚本中的内容采取对应的动作,该部分内容定义在由### BEGIN INIT INFO和### END INIT INFO包起来的块中

	### BEGIN INIT INFO
	# Provides: lsb-ourdb
	# Required-Start: $local_fs $network $remote_fs
	# Required-Stop: $local_fs $network $remote_fs
	# Default-Start:  2 3 4 5
	# Default-Stop: 0 1 6
	# Short-Description: start and stop OurDB
	# Description: OurDB is a very fast and reliable database
	#	 engine used for illustrating init scripts
	### END INIT INFO

可以定义服务依赖,启动级别,描述等信息,详细内容参考 Linux服务定义

参考

  1. Linux服务启动
  2. Linux服务定义

猜你喜欢

转载自blog.csdn.net/SonOfWind0311/article/details/87873989