systemd服务启动文件的编写
在 Linux 系统中,systemd 是一个系统和服务管理器,它负责管理系统的启动过程、服务的生命周期以及系统资源的分配等。通过 systemd 实现服务开机自启的原理主要基于以下几个方面:
1. systemd 的启动目标(Target)机制
- Linux 系统在启动时会根据预设的目标(Target)来决定启动哪些服务。
systemd定义了多个目标,例如multi-user.target(多用户图形界面目标)、graphical.target(图形界面目标)和multi-user.target(多用户命令行目标)等。 - 每个目标都对应一个或多个服务。当系统启动并进入某个目标时,
systemd会自动启动与该目标关联的服务。 - 例如,如果系统启动时进入
graphical.target,那么所有与graphical.target关联的服务(如图形界面服务、桌面环境服务等)都会被自动启动。
2. 服务单元文件(.service 文件)的作用
- 每个需要开机自启的服务都需要一个服务单元文件(
.service文件)。这个文件定义了服务的启动条件、启动方式、依赖关系等信息。 - 在服务单元文件中,
WantedBy=或RequiredBy=指令用于指定服务与某个目标的关联关系。例如:
这表示当系统进入[Install] WantedBy=multi-user.targetmulti-user.target目标时,该服务会被自动启动。 - 服务单元文件通常存放在
/etc/systemd/system/或/usr/lib/systemd/system/目录下。
3. systemd 的依赖关系管理
systemd通过服务单元文件中的After=和Before=指令来管理服务之间的启动顺序。例如:
这表示该服务会在[Unit] After=network.targetnetwork.target之后启动。- 通过这种依赖关系,
systemd可以确保服务在启动时能够按照正确的顺序启动,从而避免因依赖服务未启动而导致的问题。
4. systemd 的持久化配置
- 当服务单元文件被创建或修改后,需要通过
systemctl enable命令将其启用。这个命令会将服务与目标关联起来,并在系统启动时自动加载。 systemctl enable命令会在/etc/systemd/system/目录下创建一个符号链接,指向服务单元文件。这样,systemd在启动时会根据这些符号链接找到需要启动的服务。- 例如:
这会在systemctl enable myservice.service/etc/systemd/system/multi-user.target.wants/目录下创建一个指向myservice.service的符号链接。
5. systemd 的启动流程
- 当系统启动时,
systemd会读取/etc/systemd/system/和/usr/lib/systemd/system/目录下的服务单元文件。 - 根据服务单元文件中的配置和目标的关联关系,
systemd会决定哪些服务需要在当前目标下启动。 systemd会按照服务之间的依赖关系和启动顺序,依次启动这些服务。
总结
通过 systemd 实现服务开机自启的原理是基于 systemd 的目标机制、服务单元文件的配置、依赖关系管理以及持久化配置。systemd 通过这些机制确保在系统启动时能够根据预设的目标和条件自动启动所需的服务。
/lib/systemd/system/ 是 Linux 系统中 systemd 服务管理器的配置文件目录,用于存放服务单元文件(通常是 .service 文件)。这些文件定义了系统服务的启动条件、执行命令、依赖关系等信息。以下是如何编写 /lib/systemd/system/ 目录下的服务单元文件的步骤和要点:
1. 了解服务单元文件的基本结构
服务单元文件通常以 .service 为扩展名,其内容由多个部分组成,每个部分由一个 [Section] 标识。常见的部分包括:
[Unit] 部分
这部分定义了服务的元数据和启动顺序等信息。
Description:服务的描述信息,用于说明服务的功能。After:指定服务在哪些服务启动之后启动。例如,After=network.target表示该服务在network.target之后启动。Before:指定服务在哪些服务启动之前启动。Wants、Requires:用于定义服务之间的依赖关系。Wants表示弱依赖,即使依赖的服务启动失败,当前服务仍会尝试启动;Requires表示强依赖,如果依赖的服务启动失败,当前服务也会启动失败。
[Service] 部分
这部分定义了服务的执行细节。
-
Type:指定服务的启动类型,常见的有:simple:默认值,表示服务启动时直接运行ExecStart指定的命令。forking:适用于传统守护进程,该类型的服务会在启动时创建子进程,父进程退出后,systemd 认为服务已启动。oneshot:适用于只运行一次的命令,通常用于初始化脚本。
-
ExecStart:指定启动服务时要执行的命令。 -
ExecStop:指定停止服务时要执行的命令。 -
ExecReload:指定重新加载服务配置时要执行的命令。 -
Restart:定义服务异常退出时是否自动重启,可选值有no(不重启)、always(始终重启)、on-failure(仅在失败时重启)等。
[Install] 部分
这部分定义了服务的安装信息,主要用于控制服务的启动方式。
WantedBy:指定服务所属的运行级别目标。例如,WantedBy=multi-user.target表示该服务在多用户图形界面目标下启动。Alias:为服务定义别名。
2. 编写示例
以下是一个简单的服务单元文件示例,假设我们要编写一个名为 my_service 的服务,该服务运行一个简单的 Python 脚本。
创建服务单元文件
在 /lib/systemd/system/ 目录下创建一个名为 my_service.service 的文件:
sudo nano /lib/systemd/system/my_service.service
编写内容
[Unit]
Description=My Custom Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /path/to/your/script.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
在这个示例中:
[Unit]部分:描述服务为 “My Custom Service”,并指定该服务在网络目标启动后启动。[Service]部分:指定服务类型为simple,启动命令为运行/path/to/your/script.py脚本,并在服务失败时自动重启。[Install]部分:指定服务在多用户目标下启动。
保存并退出
保存文件并退出编辑器。
3. 启用和启动服务
编写完成后,需要对服务进行启用和启动操作。
重新加载 systemd 配置
sudo systemctl daemon-reload
这一步是为了让 systemd 重新加载配置文件,使其能够识别新添加的服务。
启用服务
sudo systemctl enable my_service.service
这会将服务添加到指定的运行级别目标中,使其在系统启动时自动启动。
启动服务
sudo systemctl start my_service.service
启动服务后,可以通过以下命令查看服务状态:
sudo systemctl status my_service.service
如果一切正常,你的服务应该已经成功启动并运行了。
示例
docker服务的启动
[root@master231 ~]# cat /lib/systemd/system/docker.service
[Unit]
Description=oldboyedu linux Docke Engine
Documentation=https://docs.docker.com,https://www.oldboyedu.com
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
[Install]
WantedBy=multi-user.target
本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18812856

浙公网安备 33010602011771号