systemd 服务在其他服务启动之前和之后运行

gab*_*zed 2 linux service systemd

我想在 autofs 启动之前和之后运行脚本。我有两个系统服务:

backup1.service 在 autofs 之前运行

[Unit]
Description=Backup mount

[Service]
ExecStart=/backup/sw/bmount before


[Install]
WantedBy=autofs.service
Run Code Online (Sandbox Code Playgroud)

backup2.service 在 autofs 之后运行

[Unit]
Description=Backup mount
PartOf=autofs.service
After=autofs.service

[Service]
ExecStart=/backup/sw/bmount after

[Install]
WantedBy=autofs.service
Run Code Online (Sandbox Code Playgroud)

我可以确定 bmount 脚本中的前后状态,因此我可以不带参数调用它,并且我只能使用一项服务,但不知道如何使用。

是否可以?

Ste*_*art 6

有几种方法可以做到这一点:

编辑 autofs.service

根据设计,服务文件应该是可现场维护的。在基于 Debian 的平台上,供应商提供的服务文件位于 中/lib/systemd/system/,我认为 redhat 中也有它们/usr/lib/systemd/system/,但您可以使用/etc/systemd/system/.

在那种情况下,我会

cp /lib/systemd/system/autofs.service /etc/systemd/system/autofs.service
Run Code Online (Sandbox Code Playgroud)

然后在该[Service]部分中,我添加:

ExecStartPre=/backup/sw/bmount before
ExecStartPost=/backup/sw/bmount after
Run Code Online (Sandbox Code Playgroud)

手册页systemd.service说:

ExecStart= 命令仅在所有 ExecStartPre= 命令成功退出后运行。

ExecStartPost= 命令仅在 ExecStart= 中指定的命令被成功调用后运行,由 Type= 确定(即,对于 Type=simple 或 Type=idle,进程已启动,对于 Type=oneshot,最后一个 ExecStart= 进程成功退出,...)。

插入式服务参数

执行与上述相同操作的更优雅的方法是使用 drop-in。/etc/systemd/system/autofs.service.d/backup.conf只需使用以下内容创建:

[Service]
ExecStartPre=/backup/sw/bmount before
ExecStartPost=/backup/sw/bmount after
Run Code Online (Sandbox Code Playgroud)

人际关系

也许autofs.service已经有了ExecStartPre命令ExecStartPost,而您担心会干扰该服务。在这种情况下,您可以使用关系来启动/停止您的服务。

[Unit]
Description=Backup mount
PartOf=autofs.service
Before=autofs.service

[Service]
Type=oneshot
ExecStart=/backup/sw/bmount before

[Install]
WantedBy=autofs.service
Run Code Online (Sandbox Code Playgroud)


[Unit]
Description=Backup mount
PartOf=autofs.service
After=autofs.service

[Service]
Type=oneshot
ExecStart=/backup/sw/bmount after

[Install]
WantedBy=autofs.service
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

  • PartOf=autofs.service意思是“当 systemd 停止或重新启动时autofs.service,操作将传播到backup.service
  • Before=autofs.service意思是“如果两个单元都正在启动,autofs.service则启动将被延迟,直到backup.service完成启动。”
  • After=autofs.service意思是“如果两个单元都正在启动,backup.service则启动将被延迟,直到autofs.service完成启动。”
  • WantedBy=autofs.service意思是“backup.service如果是则启动autofs.service”。
  • Type=oneshot意味着即使进程完成后,服务仍将被视为正在运行ExecStart=

请务必运行,systemctl daemon-reload以便 systemd 读取新服务。还要运行systemctl enable backup.service以确保WantedBy=成为Wants=for autofs.service

我认为您的解决方案非常接近。