zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Linux服务管理 — 78、独立服务的启动脚本分析

2023-04-18 14:54:52 时间

既然独立的服务启动是依靠/etc/init.d/服务名这个脚本来进行启动管理的,那么这个脚本中到底是什么样子的?我们以apache服务的启动脚本来学习一下启动脚本到底是怎么实现一个服务启动的。

提示:/etc/init.d/服务名/etc/rc.d/init.d/服务名是一样的,软链接关系。

查看apachehttpd服务,如下所示:

shell

[root@localhost ~]# vim /etc/rc.d/init.d/httpd

内容如下:
#!/bin/bash
#
# httpd 	Startup script for the Apache HTTP Server
#
# 一、以下两句话是能被chkcongif命令识别的,用于apache自启动。其他的就都是注释信息了。
# 1.自启动设定:代表自启动级别,85(S85)代表启动序号,15(K15)代表关闭序号。
# 这个可以自定义,只要别和其他服务重叠即可。
# chkconfig: -85 15
#
# 2.服务描述。
# description:The Apache HTTP Server is an efficient and extensible
# 	server implementing the current HTTP standards.
#
# processname:httpd
# config:/etc/httpd/conf/httpd.conf
# config:/etc/sysconfig/httpd
# pidfile:/var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides:httpd
# Required-Start:$local_fs $remote_fs $network $named
# Required-Stop:$local_fs $remote_fs $network
# Should-Start:distcache
# Short-Description:start and stop Apache HTTP Server
# Description:The Apache HTTP Server is an extensible server
# 	implementing the current HTTP standards.
### END INIT INFO
# 以上都是注释。


# 二、下面两个进行apache的函数调用
# Source function library.
# ”.”其实就是source,就是调用functions文件。
./etc/rc.d/init.d/functions


# 判断httpd如果是文件,则调用httpd文件。
if[-f/etc/sysconfig/httpd];then
	./etc/sysconfig/httpd 
fi


# 三、以下开始定义变量
# 定义变量HTTPD_LANG的值。并追加变量的值为C,即英文。
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in/etc/sysconfig/httpd to use a server
# with the thread-based ”worker" MPM;BE WARNED that some modules may not
# work correctly with a thread-based MPM;notably PHP will refuse to start.

# Path to the apachectl script,server binary,and short-form for messages.
#定义一系列变量,用于后面的执行。
apachect1=/usr/sbin/apachectl 
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd 
pidfile=${PIDFILE-/var/run/httpd/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}

# 定义全局命令返回变量。
RETVAL=0
STOP TIMEOUT=${STOP TIMEOUT-10}


# 四、下面是定义的函数
# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shut down
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
# 定义start函数,用于apache的启动。
# 如果守护进程/usr/sbin/httpd启动成功($RETVAL =0),
# 就建立/var/lock/subsys/httpd文件(touch ${lockfile} )
# 通过$httpd变量执行/usr/sbin/httpd命令启动apache。
# 通过$pidfile变量调用apache的PID。
# 通过变量$OPTIONS定义命令执行时的初始化环境配置,依赖/etc/sysconfig/httpd文件。
start() {
	echo -n $"Starting $prog: "
	LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS 
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && touch ${lockfile} 
	return $RETVAL
}



# When stopping httpd, a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
# 定义stop函数,用来关闭apache服务,关闭服务之后会删除pid文件。
stop() {
	status -p ${pidfile} $httpd > /dev/null 
	if [[ $?= 0 ]]; then
    	echo -n $"Stopping $prog:"
   		killproc -p ${ pidfile} -d ${STOP_TIMEOUT} $httpd
	else 
		echo -n $"Stopping $prog:" 
		success 
	fi 
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}	
}


# 定义reload函数,用于apache的重新加载。
# 通过/usr/sbin/httpd -t命令判断apache的配置文件。
# 如果配置文件报错,则输出错误提示。
# 如果配置文件正确,则重新加载apache。
reload() {
	echo -n $"Reloading $prog:"
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then 
    	RETVAL=6
		echo $"not reloading due to configuration syntax error"
		failure $"not reloading $httpd due to configuration syntax error"
	else
		# Force LSB behaviour from killproc 
		LSB=1 ki11proc -p ${pidfile} $httpd -HUP 
		RETVAL=$?
		if [ $RETVAL -eq 7 ]; then
			failure $"httpd shutdown"
		fi
	fi
	echo
}

# 五、下面是真正的程序体
# See how we were called.
# 判断执行脚本后的第一个参数的值,$1表示执行脚本时的第一个参数。
case "$1" in
# 如果参数值为start,则调用start函数。
start)
	start
	;;
	;;
	
# 如果参数值为stop,则调用stop函数。	
stop)
	stop
	;;
	
# 如果参数值为status,则执行status-p Shttpd命令测试apache状态。
status)
	status -p ${pidfile} $httpd 
	RETVAL=$?
	;;

# 如果参数值为restart,则先调用stop函数,再调用start函数
restart)
	stop 
	start
	;;
	
# 如果参数值为condrestart或try-restart,
# 则只有apache服务是已经运行时才先调用stop函数,再调用start函数,重启apache。
# 如果apache服务没有运行,则不重启apache.
condrestartltry-restart)
	if status -p ${pidfile} $httpd >&/dev/null;then 
		stop 
		start 
	fi
	;;

# 如果参数值为force-reload或reload,则调用reload函数。
force-reload|reload)
	reload
	;;

# 如果参数是graceful或help或configtest或fullstatus,
# 则执行/usr/sbin/apachectl命令,并把参数作为命令的参数传入apachectl命令。
graceful|help|configtest|ful1status)
	$apachectl $@
	RETVAL=$?
	;;


# 如果输出的参数不是以上任何参数,则输出错误信息
*)
	echo
	$"Usage:$pro{start lstoplrestartl condrestartl try-restartl force-reloadlreload status full status graceful l he lpl confis test}"
	RETVAL=2
	esac
exit $RETVAL

说明:

我们分析服务的启动脚本,主要是为了学习一下启动脚本写法。

当我们执行一个服务启动命令,例如:[root@localhost ~]# /etc/rc.d/init.d/httpd start

start作为一个参数,传入脚本中,执行脚本程序体中start参数所对应的代码。

然后调用start函数,来执行启动命令。

start函数中又用了很多在启动脚本前面定义的很多变量。

最终把一个服务启动起来。