Ubuntu服务管理

Linux 服务管理两种方式service和systemctl的用法

service命令

service命令其实是去/etc/init.d目录下,去执行相关程序。

其中脚本需要我们自己编写。

基本步骤
  1. 进入 /etc/init.d
  2. 简历一个脚本文件,并赋予755权限:chmod 755 文件名

以kms服务脚本为例

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
#!/bin/bash

### BEGIN INIT INFO
# Provides: kms-service
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start kms at boot time
# Description: Start or stop the KMS-service
### END INIT INFO

NAME="KMS"
NAME_BIN="kms"
FILE="/home/ubuntu"
BIN="${FILE}/kms"


Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
Info="${Green_font_prefix}[信息]${Font_color_suffix}"
Error="${Red_font_prefix}[错误]${Font_color_suffix}"
RETVAL=0

check_running(){
PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}')
if [[ ! -z ${PID} ]]; then
#echo -e "${Info}${NAME} 正在运行!"
return 0
else
#echo -e "${Error}${NAME} 没有运行!"
return 1
fi
}
start(){
check_running
if [[ $? -eq 0 ]]; then
echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0
else
cd ${FILE}
echo -e "${Info} $NAME 启动中..."
ulimit -n 51200
./kms
sleep 1s
check_running
if [[ $? -eq 0 ]]; then
echo -e "${Info} $NAME 启动成功 !"
else
echo -e "${Error} $NAME 启动失败(请运行脚本查看日志错误输出) !"
fi
fi
}
stop(){
check_running
if [[ $? -eq 0 ]]; then
kill -9 ${PID}
RETVAL=$?
if [[ $RETVAL -eq 0 ]]; then
echo -e "${Info} $NAME 停止成功 !"
else
echo -e "${Error} $NAME 停止失败 !"
fi
else
echo -e "${Info} $NAME 未运行"
RETVAL=1
fi
}
status(){
check_running
if [[ $? -eq 0 ]]; then
#View_User
echo -e "${Info} $NAME (PID ${PID}) 正在运行..."
else
echo -e "${Info} $NAME 未运行 !"
RETVAL=1
fi
}
restart(){
stop
sleep 2s
start
}
case "$1" in
start|stop|restart|status)
$1
;;
*)
echo "使用方法: $0 { start | stop | restart | status }"
RETVAL=1
;;
esac
exit $RETVAL

加入到系统启动中
1
2
3
4
// 添加到系统启动
update-rc.d kms defaults
// 从系统启动中删除
update-rc.d kms remove
启动服务
1
2
service kms start
service kms stop

systemctl命令

​ systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。systemd对应的进程管理命令是systemctl

还是以kms服务脚本为例

新建一个kms.service文件,保存在 /etc/systemd/system/kms.service.

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=kms-service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/kms
ExecStop=/bin/kill -9 $MAINPID

[Install]
WantedBy=multi-user.target

可以看到service文件一般由:[Unit][Service][Install] 三部分组成

  1. [Unit] 主要是对这个服务的说明,内容, 文档介绍以及对一些依赖服务定义
  2. [Service] 服务的主体定义,主要定义服务的一些运行参数,及操作动作
  3. [Install] 服务安装的相关设置,一般可设置为多用户的

以下是具体参数

[Unit]

参数 描述
Description 服务描述,作为systemctl status 命令输出的一个介绍
Documentation 一个url 定义服务的具体介绍网址
After 在什么服务启动之后
Before 在什么服务启动之前启动
Requires 依赖其他的单元服务, 需要与列出的服务一起激活,若任何服务无法启动,则该单元不会被激活
Wants 比Requires依赖性弱,若其他服务没有启动成功,该服务也不受影响,只是表示一种推荐

[Service]

Type 1.simple默认参数,进程作为主进程
2.forking是后台运行的形式,主进程退出,os接管子进程
User 设置服务运行的用户
Group 设置服务运行的用户组
PIDFile 存放PID的文件路径, 对于type设置为forking建议使用该项
ExecStart 服务的具体运行命令
ExecStartPre 指定在ExecStart执行的自定义命令
ExecStartPost 指定在ExecStart执行的自定义命令
ExecReload 重启命令,重新加载的动作, 重新加载时执行的命令或者脚本
ExecStop 停止命令,停止时要执行的命令或脚本
Restart 定义何种情况Systemd会自动重启当前服务,值: 包括always(总是重启)noon-successon-failureon-abnormalon-aborton-watchdog 对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal
TimeoutStartSec 等待启动的时间。如果守护进程服务没有在配置的时间内发送启动完成的信号,则该服务将被认为失败, 服务将退出。
以秒为单位, “0”来禁用。默认为, 默认使用DefaultTimeoutStartSec=20,
若使用Type=oneshot,则该模式默认情况下超时是禁用的
TimeoutStopSec 等待关闭的超时时间
TimeoutSec 快速配置TimeoutStartSec和TimeoutStopSec时间
KillMode control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
process:只杀主进程
mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none:没有进程会被杀掉,只是执行服务的 stop 命令。
Environmen 指定环境变量
PrivateTmp=True 表示给服务分配独立的临时空间

注意:[Service]部分的启动、重启、停止命令必须使用绝对路径,使用相对路径则会报错

[Install]

RequiredBy 依赖该服务的服务列表
WantedBy 表示该服务所在的 Target, multi-user.target 可以设置为多用户模式具体参考手册systemd.unit(5)

参考手册:http://www.jinbuguo.com/systemd/systemd.index.html

服务状态列表:

loaded 系统服务已经初始化完成,加载过配置
actvie(running) 正常运行
actvie(exited) 正常结束的服务
active(waitting) 等待其他的事件才继续处理
inactive 服务关闭
enabled 服务开机启动
disabled 服务开机不自启
static 服务开机启动项不可被管理
falied 系统配置错误

管理日志:

Systemd 统一管理所有 Unit 的启动日志。

journalctl 命令查看所有日志(内核日志和应用日志)
journalctl _PID= 查看对应pid的日志

unit管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 立即启动一个服务
sudo systemctl start apache.service

# 立即停止一个服务
sudo systemctl stop apache.service

# 设置开机启动
sudo systemctl enable apache.service

# 关闭开机启动
sudo systemctl disable apache.service

# 重启一个服务
sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
sudo systemctl reload apache.service

# 重载所有修改过的配置文件
sudo systemctl daemon-reload