CentOS 7 创建自定义服务

1,922 阅读3分钟

概述

CentOS 7 使用 systemctl 管理服务,服务可分为系统服务和用户服务。

  • 系统服务跟随系统的运行而运行,既开机自启动服务。
  • 用户服务在当前用户登录系统后开发运行。

系统服务和用户服务分别存放与以下两个目录

  • 系统服务: /usr/lib/systemd/system
  • 用户服务: /usr/lib/systemd/user

CentOS 7 服务文件需命名为扩展名为service文件,该文件主要由以下三部分组成,格式如下

[Unit]
Description=Tomcat Service
[Service]
ExecStart= /startup.service
[Install]
WantedBy=multi-user.target

服务说明

[Unit]

用于设置服务描述信息、启动顺序、依赖关系,参数如下

选项 描述
Description 当前服务的描述信息
Documentation 关于该服务相关文档路径
After 定义在哪些服务之后启动
Before 定义在哪些服务之前启动
Wants 表示服务之间的依赖关系,该关系是弱依赖,即依赖服务启动成功与否,都不会影响该服务的启动
Requires Wants选项都表示服务依赖关系,该关系是强依赖,即依赖服务启动失败,该服务也启动失败。

[Service]

设置服务的启动方式、运行程序、运行用户、用户组等信息,具体情况如下:

选项 描述
Type 服务运行方式
User 运行服务的用户
Group 运行服务的用户组
ExecStart 要运行的程序
ExecReload 定义如何重启
ExecStop 定义如何停止服务
ExecStartPre 启动服务之前执行的命令
ExecStartPost 启动服务之后执行的命令
ExecStopPost 停止服务之后执行的命令
PrivateTmp 是否给服务分配独立的临时空间
EnviromentFile 配置服务环境参数文件
RestartSec 表示服务重启之前要等待时间,单位:秒
PIDFile 进程文件存放地址
KillSignal 停止信号量,通常为SIGNQUIT
TimeoutStopSec 停止超时时间
KillMode 定义Systemd如何停止服务
Restart 服务退出后,定义Systemd的重启方式

注意

所有启动设置之前,都可以加上连词号(-),表示抑制错误。即发生错误的时候,不影响其他命令的执行。

Type

选项 描述
simple ExecStart以进行方式运行程序,默认值
forking ExecStart以fork()方式启动,此时父进程将会退出,子进程将成为主进程。
oneshot 类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
dbus 类似于simple,但会等待 D-Bus 信号后启动
notify 类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
idle 类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

KillMode

选项 描述
control-group 当前控制组里面的所有子进程,都会被杀掉,默认值
process 只杀主进程
mixed 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none 没有进程会被杀掉,只是执行服务的 stop 命令

Restart

选项 描述
no 退出后不会重启
on-success 只有正常退出时(退出状态码为0),才会重启
on-failure 非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal 只有被信号终止和超时,才会重启
on-abort 只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog 超时退出,才会重启
always 不管是什么退出原因,总是重启

[Install]

定义如何安装这个配置文件,即怎样做到开机启动。

WantedBy表示服务所在的TargetTarget的含义是服务组,表示一组服务,它可以设置的值如下:

选项 描述
multi-user.target 表示多用户命令行状态
graphical.target 表示图形用户状态,它依赖于multi-user.target

Example

[Unit]
Description=Apache Tomcat 9 Web Service,AS Coding4fun Service
Apter=network.target

[Service]
Type=forking
PIDFile=/var/run/tomcat9_1.pid
Environment=JAVA_HOME=/coding4fun/application/jdk1.8.0_261
Environment=CATALINA_PID=/var/run/tomcat9_1.pid
Environment=CATALINA_HOME=/coding4fun/application/tomcat9/tomcat9.0.37
Environment=CATALINA_BASE=/coding4fun/application/tomcat9/instances/instance1

ExecStart=$CATALINA_HOEM/bin/jsvc \
  -server \
  -classpath $CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar \
  -outfile /coding4fun/logs/tomcat9/instance1/catalina.out \
  -errfile /coding4fun/logs/tomcat9/instance1/catalina.err \
  -Djava.library.path=/usr/local/apr/lib \
  -Dcatalina.home=$CATALINA_HOME \
  -Dcatalina.base=$CATALINA_BASE \
  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
  -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
  org.apache.catalina.startup.Bootstrap

ExecStop=$CATALINA_HOME/bin/jsvc \
  -pidfile /var/run/tomcat9_1.pid \
  -stop \
  org.apache.catalina.startup.Bootstrap

[Install]
WantedBy=multi-user.target
参考文章