欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux服务那些事

程序员文章站 2022-05-06 08:00:43
...

写这个的起因是遇到了一个问题,需要写个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服务定义

system.service方式定义服务

定义方式可以参考:system.service方式定义服务

参考

  1. Linux服务启动
  2. Linux服务定义
  3. system.service方式定义服务
相关标签: linux service

上一篇: Spring Cloud

下一篇: Spring Cloud