创建systemd service配置文件

systemd不仅仅只有service一个类型,还有其他类型,例如: socket、target、timer等等,但是service无疑是最最重要的一个,所以本篇文章将介绍service配置文件。

systemd unit配置文件路径

配置目录说明

systemd配置文件,有2个路径,分别是:

  • /usr/lib/systemd/system

该目录包含系统安装的软件所提供的systemd配置单元文件,一般情况下,该文件均有软件包所属,管理员不应该直接修改此文件,若后续对包进行升级都有可能替换掉这些文件,

  • /etc/systemd/system

该目录存放管理员定义的systemd单元文件,管理员可以在此目录下定义systemd单元文件,若该目录下的文件和/usr/lib/systemd/system目录下的文件名称一致,则以该目录下配置为准,因为操作系统会优先读取该目录下的配置。

配置优先级例子

这里举个例子。

操作步骤:首先使用systemctl status查看nginx的状态,并且将其loaded的配置单元文件挪到/etc/systemd/system/nginx.service下,再重载下配置文件,并且重新查看nginx的状态。

查看nginx状态:

arduino 复制代码
# systemctl status nginx

将配置文件挪到/etc/systemd/system/下

shell 复制代码
# cp -a /usr/lib/systemd/system/nginx.service /etc/systemd/system/
# ls -l /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx.service

重新加载配置

arduino 复制代码
# systemctl daemon-reload

重新查看nginx的状态

shell 复制代码
# /etc/systemd/system/nginx.service

通过上面的案例可以分析得出,当/usr/lib/systemd/system/和 /etc/systemd/system/都存在配置文件的时候,是以/etc/systemd/system/为准。

软件升级导致/usr/lib/systemd/system/配置文件被重置,这里将不做演示。

service 配置结构

service配置组成部分

systemd所有的单元配置文件均有如下三个部分组成:

  • Unit:systemd单元的基本元数据,如描述、文档指定依赖关系等。

  • 单元类型: 这里根据systemd单元类型的不同,配置也相应的不同,例如:service单元应当配置[Service],而socket单元应当配置Socket等。

  • Install: 定义单元的安装和启动配置。

如Service类型所定义的配置文件应当为:

ini 复制代码
[Unit]
;; 描述Unit、指定依赖关系等

[Service]
;; Service 详细配置,如,启动、停止命令,启动方式等。

[Install]
;; 定义Service安装和启动配置

除此之外,systemd还允许加载额外的配置文件,以nginx.service为例,处理在/etc/systemd/system/nginx.service外,还将从/etc/systemd/system/nginx.service.d/*.conf下读取配置,配合格式和上述一致。

service配置具体含义

Unit配置描述

关键字 描述
Description 该配置为单元概述,该内容会记录到systemctl status输出中。
Documentation 该配置为单元帮助文档,参数以空格分割的URL列表,引用单元或配置的文档。有固定的类型格式。
Requires 该配置为配置单元的依赖关系,如果依赖的单元无法启动,则该单位就无法激活。
Wants 该配置为单元的依赖关系,比Requires还要弱的配置,如果依赖的单元无法启动,则该单位也可以正常启动。
Before 该配置定义启动单位的顺序,配置的单元将在本单元前启动。
After 该配置定义启动单位的顺序,配置的单元将在本单元后启动。

这里提及一下,Requires 和 Wants 以及 Before 和 After 的区别,前两者表示依赖关系,后两者表示启动顺序。

Service配置描述

关键字 描述
Type 该配置为进程启动的类型。
ExecStart 该配置表示在启动该单元要执行的命令或者脚本。
ExecStop 该配置表示在停止时需要执行的命令或者脚本。
ExecReload 该配置表示在重新载入单元的时候需要执行的命令或者脚本。
Restart 该配置表示进程在异常退出后,会被重新启动。
KillSignal 该配置表示系统要停止或者重新启动服时,使用指定的信号来通知进程,默认信号为SIGTERM。

除此之外,不仅有ExecStart,还能配置数条ExecStartPre,该配置表述在启动之前应当执行的命令或者脚本,但是ExecStart仅有一条;除此之外,还有ExecStopPre、ExecReloadPre 以此类推。

Install配置描述

关键字 描述
Alias 该配置表示为该单元提供别名,除systemctl enable外,其余均可使用别名控制。
WantedBy 该配置表示当设置该单元开机自启后,期望于放入哪个target下。
RequiredBy 该配置表示该单元在何种target下被启动。
Also 该配置表示引入一个额外的配置项。

分析nginx.service配置文件

这里先分析一下nginx.service文件,如果想要自定义该文件,建议先复制到/etc/systemd/system/下,具体配置信息为:

ini 复制代码
# cp -a /usr/lib/systemd/system/nginx.service /etc/systemd/system/
# cat /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target
#

上述配置中,

[Unit]表示该配置单元的概述:

  • Description是简介,在使用systemctl status查看状态的时候,会显示出来,例如:
  • After表示在启动nginx后,要启动network-online.target、remote-fs.target、nss-lookup.target等单元。
  • Wants表示在启动nginx之前要启动想要的依赖,这里是network-online.target,当然即使启动不成功,也会正常启动nginx的。

[Service]表示服务本身配置

  • Type表示启动的方式,这里是fork一个新的进程来启动
  • PIDFile表示定义的pid路径
  • ExecStartPre表示在启动服务前执行的动作,这里将删除此前的pid,命令为:/usr/bin/rm -f /run/nginx.pid,而后又是ExecStartPre,该参数可以多次出现,执行的命令为:/usr/sbin/nginx -t
  • ExecStart表示启动服务执行的命令,命令为:/usr/sbin/nginx
  • ExecReload表示执行systemctl reload执行的命令,该命令为/usr/sbin/nginx -s reload
  • KillSignal表示执行systemctl stop的时候,向进程发出的信号,SIGQUIT的信号值为:3
  • TimeoutStopSec表示停止最大时间为5秒
  • KillMode表示杀掉的类型为进程
  • PrivateTmp表示启动服务的时候启动临时文件系统处理

Install表示服务的安装和启动配置

  • WantedBy表示当使用systemctl enable的时候,期望将此服务放置到multi-user.target中

总结

在创建systemd配置单元时,可以往2个目录写配置文件,分别是:/usr/lib/systemd/system/和 /etc/systemd/system/,如果是自定义的单元,那么往哪个目录放都可以,如果是修改目前已有的配置文件,建议复制/usr/lib/systemd/system/到/etc/systemd/system/进行修改,避免因为软件升级等因素,导致配置文件修改内容丢失。

systemd所有的单元配置文件均有3个部分组成,分别是Unit、具体的类型、Install,其中对于Service而言,应当至少包含启动命令或者脚本等。

相关推荐
瑞雪兆丰年兮13 小时前
JavaWeb-day11-SpringBootWeb案例(文件上传)
java·运维·服务器·javaweb·oss
那明眸似水14 小时前
云原生项目三:Docker秒级启动NextCloud个人网盘存储办公系统
linux·运维·docker·云原生·容器
小南家的青蛙15 小时前
微服务体系下DevOps运维岗位面试方案设计
运维·面试·职场和发展·devops
知已难寻1 天前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
默|笙1 天前
【Linux网络】网络层协议 IP(1)理解报头、网段划分
linux·网络·tcp/ip
修己xj1 天前
nslookup 使用指南:两种模式与常用查询技巧
linux
唠玖馆1 天前
文件系统详解
linux·文件系统·ext2
GeW1 天前
当Linux内核开始“确定性”,制造高端化才有了底层语法
linux
星恒随风1 天前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio1 天前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型