读懂 `systemd` 的 Unit 配置文件

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【6月更文挑战第13天】

在使用 systemd 配置系统服务的时候,都是从一个 Unit 配置文件开始的,这篇文章从一个例子入手,来聊一聊怎样看一个服务的 Unit 配置文件。

我们从比较常用的 Nginx 的 Unit 配置文件入手,当在 Linux 系统中通过包管理器安装 Nginx 之后,会自动添加 Nginx 的系统服务配置,要查看 Nginx 的服务配置,可以使用如下的命令:

systemctl cat nginx.service

得到的内容去掉注释后如下:

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/n
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

我们分别按照 [Unit]、[Service]、[Install] 三个部分来看。

Unit

这部分配置的是 Unit 的一些描述信息、系统顺序和依赖关系等信息。

Description 的值是描述信息,以上 Nginx 的例子中,描述了 Nginx 是一个高性能的 Web 服务器和反向代理服务器。

After 部分指的是它的启动顺序,如果 network.target 需要启动,那么 Nginx 会在其启动后启动。如果需要指定它在谁之前启动,可以使用 Before 字段。

注意,这里的 After 和 Before 配置的只是启动顺序,并不是依赖关系。如果要声明依赖关系,需要用到另外两个字段,Nginx 的配置中没有,如果你安装了 Docker,可以查看 docker.service 配置信息,能够在 Unit 部分看到如下两行:

Wants=network-online.target
Requires=docker.socket

这里的 Wants 和 Requires 都代表依赖关系。Wants 表示弱依赖,就是说,如果 network-online.target 启动失败或者运行停止,不会影响 docker.service 的继续启动。而 Requires 代表强依赖关系,如果 docker.socket 启动失败或者运行停止,那么 docker.service 也要终止运行。

Service

接下来看 Service 的部分,这部分主要配置了当前的服务是如何启动的。

Type 字段是指启动的类型,这里的 forking 是指 ExecStart 字段将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程。Type 字段的默认值是 simple,指 ExecStart 字段启动的进程为主进程。

PIDFile 字段指该服务 PID 文件的路径,一般都在 /run/ 路径下。

接下来的几个以 Exec 开头的字段,配置的都是服务启动相关的命令:

  • ExecReload:重启时执行
  • ExecStop:停止时执行
  • ExecStartPre:启动之前执行
  • ExecStartPost:启动之后执行
  • ExecStopPost:停止之后执行

这里配置的内容可以是一个命令,也可以是一个脚本文件的命令。

TimeoutStopSec 指的是 ExecStop 执行停止的超市时间,如果超过的这个时长,则会被强制关闭,这里关闭的方式则是由 KillMode=mixed 配置的内容来决定的。

Install

这一部分只有一行配置:

WantedBy=multi-user.target

表示当前服务所在的 Target。关于 Target 的介绍,可以参考上一篇文章(systemd 中的 Unit 和 Target 是什么?)。

因为 Target 也是一个 Unit,我们可以通过 systemctl cat multi-user.target 命令,查看 multi-user.target 的配置文件,内容去掉注释后如下:

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

只包含 Unit 的部分,没有启动部分的内容,因为启动 Target 其实就是启动这个 Target 中所有的服务。

目录
相关文章
|
11月前
|
Linux Apache
如何使用 Systemctl 管理 Systemd 服务和单元?
如何使用 Systemctl 管理 Systemd 服务和单元?
93 0
如何使用 Systemctl 管理 Systemd 服务和单元?
|
10月前
|
Linux
17.3 【Linux】systemctl 针对 service 类型的配置文件
17.3 【Linux】systemctl 针对 service 类型的配置文件
102 0
|
10月前
|
Linux
17.1.2 【Linux】systemd使用的unit分类
17.1.2 【Linux】systemd使用的unit分类
84 0
|
Shell 微服务
systemd写微服务启动脚本范例
systemd写微服务启动脚本范例
214 0
|
设计模式 监控 网络协议
关于Linux中通过 Systemd Path Unit 监听配置更新自动重启服务的一些笔记
在 stackoverflow.com 的Unix & Linux 社区 看到有小伙伴提出相关的问题。 这里整理分享给小伙伴,博文内容涉及: Systemd 的 Path Units常用命令手册学习 Path Units 的应用 通过httpd服务演示监听配置文件自动重启服务 食用方式:需要了解一点 Systemd 理解不足小伙伴帮忙指正
218 0
|
Linux 数据中心 Python
如何使用systemd部署服务?
如何使用systemd部署服务?
439 0
|
Web App开发 Linux
利用system-config-kickstart实现半自动化安装
老司机开车了… 上车请坐稳… centos7系统 首先确认已经安装了system-config-kickstart包,如果没有安装就yum install system-config-kickstart安装下 1、首先我们先找一台主机当服务器,把相应的文件放在里面。
2041 0
Ansible service模块(学习笔记十一)
1、启动服务: ansible all -m service -a "name=nagios state=started" 2、停止服务: ansible all -m service -a "name=nagios state=stopped" 3、...
1572 0