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


20

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

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

有办法吗?或者我们必须使用 BeforeAfter 在systemd服务文件中?



4
系统化,而不是暴发户!
比尔盖子

指定名称和版本操作系统?
STTR

操作系统:Arch Linux,版本:N / A.
比尔盖子

1
@比尔盖子为什么“最后”,你不知道脚本的依赖关系,还是你想要它只是为了安全?
Paul

Answers:


23

在systemd中,建议使用Before =和After =来很好地围绕其他服务订购服务。

但是既然你没有使用Before和After,那么你可以使用:

Type=idle

作为 man systemd.service 说明

非常类似于简单,但服务二进制文件的实际执行被延迟到所有   派遣工作。这可以用于避免将shell服务的输出与状态输出交错   在控制台上。


嗨,如果我要在之前或之后使用,您是否愿意详细说明语法?
r4ccoon

有些不同的主题,但如果有人想要与系统进程分开运行用户进程,那就是 askubuntu.com/a/859583/457417
Ben Creasy

完美地设定 /proc/sys/kernel/modules_disabled1 在引导过程结束时
Stuart Cardall

0

这实际上取决于你对“引导”的定义。我假设你希望它在getty启动后立即运行。为此,您需要将服务添加到 /etc/systemd/system/getty.target.wants/ 目录。您还应确保您的文件使用与此目录中的其他服务类似的代码。要在启动和关机时运行自定义服务(只是发出蜂鸣声我的主板蜂鸣器)我使用以下脚本 /etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh 是可执行的,并且在开始时有一个shebang。

请注意,并非所有内容都将在引导时启动,但这是用户显示登录提示的位置

虽然这确实有用 Before=After=,这对我来说更容易理解,实际上是有效的;我没有找到上面的答案足够的信息。这也允许您使用两者 ExecStart=ExecStop=而不是局限于 Type=simple 像服务。


-2

我不熟悉具体细节或ArchLinux,但这里是如何管理systemd的。

好吧,基本上systemd是/etc/init.d/中的脚本集合,由/etc/rcX.d中的符号链接指向,其中X是运行级别的数量。符号链接本身具有以下格式:

[K | S] + nn + [string]

哪里:

  • NN 是一个数字,用于确定这些脚本的运行顺序
  • 是/etc/init.d/中显示的脚本名称
  • 最后K或S确定调用脚本的命令:分别停止或启动。

因此,如果您希望脚本在引导顺序中最后运行,则需要执行以下操作:

  1. 将您的脚本放在/etc/init.d/中并使其可执行
  2. 确定脚本应该从哪个目标运行级别开始(控制台为2,图形用户界面为5)。可以用类似的东西来确定 runlevel
  3. 看看这个运行级别中已有的脚本 ls /etc/rc<target runlevel>.d/ 并选择一个比已经存在的任何其他数字更大的两位数字。
  4. 使用特定于您的发行版的实用程序 update-rc.d 适用于Debian或 chkconfig 对于Fedora或手动,为您的init脚本创建一个符号链接/etc/rc.d/S。

5
你所描述的实际上是sysVinit。虽然systemd确实与sysVinit的工作方式兼容,但有一个关键的区别 - 一切都是并行执行的。还有两种类型的服务,sysVinit服务和systemd服务。您的答案可能有助于在sysVinit服务之后执行某些操作,但不一定是systemd服务。
Sam

1
从第一天开始,Systemd根本不打算与sysvinit兼容。
lzap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.