创建systemd service配置文件

systemd不仅仅只有service一个类型,还有其他类型,例如: sockettargettimer等等,但是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所有的单元配置文件均有如下三个部分组成:

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

  • 单元类型: 这里根据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 该配置定义启动单位的顺序,配置的单元将在本单元后启动。

这里提及一下,RequiresWants 以及 BeforeAfter 的区别,前两者表示依赖关系,后两者表示启动顺序。

Service配置描述

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

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

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.targetremote-fs.targetnss-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而言,应当至少包含启动命令或者脚本等。

相关推荐
Jack魏6 分钟前
Linux MySQL 8.0.29 忽略表名大小写配置
linux·mysql·mysql8·mysql常见问题
ctrigger36 分钟前
AI回答:Linux C/C++编程学习路线
linux·c语言·c++
蛊明2 小时前
下载CentOS 10
linux·运维·centos
北京-宏哥2 小时前
Linux系统安装MySQL5.7(其他版本类似)避坑指南
linux·运维·服务器
Aphelios3802 小时前
Linux 下 VIM 编辑器学习记录:从基础到进阶(下)
java·linux·学习·编辑器·vim
qw9492 小时前
Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复
linux·运维·服务器
丶只有影子2 小时前
【Nacos】从零开始启动Nacos服务(windows/linux)
linux·运维·windows·微服务·springcloud
青年vs阳光3 小时前
win10把c盘docker虚拟硬盘映射迁移到别的磁盘
运维·docker·容器
-SGlow-3 小时前
Linux相关概念和易错知识点(30)(线程互斥、线程同步)
linux·运维·服务器
技术小齐3 小时前
网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述
运维·网络·学习