你如何将 systemd 服务作为启动时的最后一个服务?

比尔盖*_*尔盖子 41 systemd

许多年前,我们可以将启动脚本写入/etc/rc.local. 加载所有系统服务后,您的脚本将运行。

现在,我们使用 systemd,我们没有rc.local了。Systemd 并行启动服务。您可以编写自己的服务来充当 rc.local`,但您不能确保它会在所有系统服务加载后运行。

有没有办法做到这一点?或者我们必须在systemd服务文件中使用BeforeAfter

小智 37

在 systemd 中,建议在其他服务周围很好地使用Before=After=订购您的服务。

但是由于您要求一种不使用Beforeand 的方法After,您可以使用:

Type=idle
Run Code Online (Sandbox Code Playgroud)

这为man systemd.service解释道:

的行为idle非常类似于simple; 但是,服务程序的实际执行会延迟,直到所有活动作业都被分派。这可用于避免 shell 服务的输出与控制台上的状态输出交错。注意,这种类型只对提高控制台输出有用,作为通用的单元排序工具没有用,而且这种服务类型的效果受到5s超时的影响,之后无论如何都会调用服务程序。

  • 引用的“idle”类型摘录包括:“请注意,此类型仅用于改进控制台输出,它不能用作通用单位排序工具,并且此服务类型的效果受 5 秒超时的影响,之后服务程序无论如何都会被调用。`这是否意味着,实际上,设置为“idle”的进程只会延迟 5 秒,而且“idle”将*不一定*实现 OP 规定的目标: `...加载所有系统服务后运行。`?? (3认同)
  • 嗨,如果我要在之前或之后使用,你愿意详细说明语法吗? (2认同)

MCO*_*tem 10

确保我们的服务将在所有其他启用的服务之后执行的最佳方法是创建您自己的目标并使其在multi-user.target.

通常:

  1. 创建目标单元/etc/systemd/system/custom.target文件AllowIsolate=yes
[Unit]
Description=My Custom Target
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes
Run Code Online (Sandbox Code Playgroud)
  1. /etc/systemd/system/last_command.service使用After=multi-user.target和创建您的服务单元文件WantedBy=custom.target
[Unit]
Description=My custom command
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/my_last_command.sh

[Install]
WantedBy=custom.target
Run Code Online (Sandbox Code Playgroud)
  1. 创建/etc/systemd/system/custom.target.wants目录
  2. 将您链接last_command.service/etc/systemd/system/custom.target.wants
ln -s /etc/systemd/system/last_command.service \
  /etc/systemd/system/custom.target.wants/last_command.service
Run Code Online (Sandbox Code Playgroud)
  1. 重新加载系统systemctl daemon-reload
  2. 将系统默认目标设置为custom.target
systemctl set-default custom.target
Run Code Online (Sandbox Code Playgroud)
  1. 或者,您可能希望立即应用custom.target
systemctl isolate custom.target
Run Code Online (Sandbox Code Playgroud)

这样,每次重新启动时,您的last_command服务将在multi-user.target达到后执行。