systemd:失败时停止启动过程(实际上是关闭)

systemd:失败时停止启动过程(实际上是关闭)

如果一次性服务失败,如何立即停止启动过程、显示一些消息(退出启动屏幕)并关闭计算机?

我的服务只启动一个脚本。如果出现问题,或者更好地说,如果发生特殊情况,我想关闭机器。到目前为止,我尝试在脚本中放入一个systemctl poweroff.但不幸的是,这个调用立即返回,启动过程正常继续,或多或少与关闭并行。就我而言,登录屏幕会出现几秒钟,直到最终完成关机。

这是我的单元文件:

[Unit]
Description=My Fancy Script
Before=NetworkManager.target

[Service]
Type=oneshot
ExecStart=/path/to/script
StandardOutput=journal+console

[Install]
WantedBy=basic.target

我什至尝试使用FailureAction=但这也不起作用。

有什么想法如何做到这一点?一定有一个“典型”的方式。例如,如果无法加载挂载点,系统将进入维护模式(这个 ctrl-D ;))并且启动会中断。

答案1

一定有一个“典型”的方式。例如,如果无法加载安装点,系统将进入维护模式并中断启动。

就在这里。如果你看一下/usr/lib/systemd/system/local-fs.target你会发现它是

OnFailure=emergency.target
OnFailureJobMode=替换-不可逆

答案2

我看到有几个选择。一种是残酷的选择,这可能适合无法损坏的无状态系统。也就是添加--force选项poweroff

poweroff --force

它的文档说:“强制立即停止、关闭电源、重新启动。不要联系初始化系统。”。

其他服务将继续并行启动,但断电应该会更快。


您所看到的行为是因为 systemd 试图通过尽可能多地并行操作来尽可能快地启动您的系统。这意味着一旦满足依赖关系,它就会立即转移到下一个任务,而不一定是在服务完成运行时。

由于登录屏幕和其他服务不依赖于您的服务运行,因此即使关闭序列已开始运行,它们也会并行启动。

您可以通过强制启动过程暂停并等待任务完成然后再继续来解决您的问题。首先,决定在自定义服务完成之前应启动哪些服务,然后使用 new 将这些服务或目标添加到您的文件中之前=条目。

相关内容