后端服务启停脚本
后端服务的启停脚本一般具备4个功能:
- 启动服务
- 停止服务
- 查看服务当前状态
- 重启服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/bash
source /etc/init.d/functions
GREEN='\033[1;32m' # 绿色
RES='\033[0m'
SRV="daemon"
# daemon程序的绝对路径
PROG="/usr/bin/$SRV"
# 锁文件
LOCK_FILE="/home/backend/lock/$SRV"
RET=0
# 服务启动函数
function start() {
mkdir -p /home/backend/lock
# 锁文件不存在,说明服务没有启动
if [ ! -f $LOCK_FILE]; then
echo -n $"Starting $PROG: "
# 启动服务,success和failure函数是系统封装的shell函数,success函数在终端输出
# “[OK]”,failure函数则在终端输出“[FAILED]”
$PROG && success || failure
RET=$?
# 创建锁文件
touch $LOCK_FILE
echo
else
# 获取服务进程id,如果获取成功,则表明服务已经在运行,否则启动服务
PID=$(pidof $PROG)
if [ ! -z "$PID"] ; then
echo -e "$SRV(${GREEN}$PID${RES}) is already running..."
else
# 服务进程id不存在,启动服务
echo -n $"Starting $PROG: "
$PROG && success || failure
RES=$?
echo
fi
fi
return $RET
}
# 服务停止函数
function stop() {
# 锁文件不存在,说明服务已经停止
if [ ! -f $LOCK_FILE ]; then
echo "$SRV is stopped"
return $RET
else
echo -n $"Stopping $PROG: "
# killproc函数是系统封装好的shell函数,用于停止服务
killproc $PROG
RET=$?
# 删除锁文件
rm -rf $LOCK_FILE
echo
return $RET
fi
}
# 服务重启函数
function restart() {
stop # 先停止服务
start # 再重新启动服务
}
# 服务状态查看函数
function status() {
if [ ! -f $LOCK_FILE ] ; then
echo "$SRV is stopped"
else
PID=$(pidof $PROG)
if [ -z "$PID" ] ; then
echo "$SRV is dead but locked"
else
echo -e "$SRV(${GREEN}$PID${RES}) is running..."
fi
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
# Usage
echo $"Usage: $0 {start|stop|restart|status} [Backend service options]"
exit 1
esac
exit $RET
加载系统自带的 shell 函数
服务启停脚本开头的“source /etc/init.d/functions”命令用于导入系统自带的定义在/etcinit.d/functions 脚本文件中的 shell 函数,以便在后面的 shell 脚本中调用这些函数。在服务启停脚本中,我们可以使用success和failure 函数,这两个函数分别用于向终端输出“[OK ]”和“[FAILED]”。
服务相关变量声明
这部分最常见的变量包括带绝对路径的服务名和锁文件。其中,锁文件用于判断服务是否被正常停止。当服务启动成功时,就会创建锁文件;而当服务被停止时,就会删除锁文件。也就是说,如果服务异常退出或者被手动“强杀”的话,锁文件是不会被删除的。因此,当服务不存在时,可以通过判断锁文件是否存在,来判断服务是否被正常停止。
除了刚才提到的常见变量,不同的服务可能还需要再配置一些其他特定的变量,这些变量的具体配置需要根据具体的服务来确定。例如,某个服务可能需要配置日志文件路径等。因此,在编写服务启停脚本时,需要根据具体的服务需求,配置相应的变量和参数,以便更好地管理和维护服务。
服务启动函数
start 函数用于启动服务。start 函数的逻辑如下:先判断锁文件是否存在,如果锁文件不存在,则表明服务没有启动,这时执行服务启动命令以启动服务,并创建锁文件。如果锁文件存在,则表明服务启动过但没有被停止,这时再判断服务是否存在。如果服务存在,则输出服务已经在运行中的提示信息,否则执行服务启动命令。
服务停止函数
stop函数用于停止服务。stop数的辑如下:先判断锁文件是否存在,如果锁文件不存在,则表明服务已经被停止,输出服务已经被停止的提示信息。如果锁文件存在,则表明服务没有被停止,这时执行服务停止命令以停止服务,最后删除锁文件。
服务重启函数
restant 函数用于重启服务。restart 函数的逻辑非常简单,就是先调用stop函数来停止服务,再调用start 函数来启动服务。
服务状态查看函数
status函数用于查看服务的状态,服务存在三种状态。
- 当锁文件不存在时,表明服务已经被停止。
- 当锁文件存在但服务不存在时,表明服务是异常退出的或是被手动“强杀”的。面
- 锁文件存在且服务正常运行。
case 语句
case语句的逻辑简单明了,就是根据服务启停脚本携带的不同参数,执行不同的函数服务启停脚本有两种使用方式:一种是直接执行脚本,比如/etc/init.d/daemond start;另种是通过 service 命令来启动,比如service daemond start,service 命令会自动执行脚本/etcinit.d/daemond 并把 start 参数传递给这个脚本。
通过上面的介绍,我们发现编写服务启停脚本并不难,只需要按照逻辑写好不同的部分即可。不同服务启停脚本的主要差异体现在启停命令的不同,而其他部分的逻辑大体相同。因此,在编写服务启停脚本时,可以先参考其他已有的脚本,再根据具体的服务需求进行相应的修改和调整。