Restart=no 在 systemd 中对于 Oneshot 类型不起作用

Restart=no 在 systemd 中对于 Oneshot 类型不起作用

我有一项服务,那就是Type=oneshot.某些服务依赖于使用Wants和 的此服务Require

根据systemd手册页,Restart=no这是默认设置,即使服务失败,服务也不会重新启动。但就我而言,我可以从journalctl日志中看到该服务重新启动了两次。

所以问题是:即使Restart=no存在,为什么还要重新启动?我尝试Restart=no在服务文件中显式添加,但它仍在重新启动。我希望我的服务只执行一次,无论结果成功还是失败。

我的 Systemd 版本是 250:systemd 250 (250.5+)

答案1

Restart=仅是服务内部规范,并不扩展到调用该单元的其他服务。来自手动的

Restart=

配置当服务启动时是否需要重新启动服务服务流程退出、被杀死或达到超时。该服务进程可能是主服务进程,但也可能是用ExecStartPre=ExecStartPost=ExecStop=ExecStopPost=、 或指定的进程之一ExecReload=。当进程的死亡是由于systemd操作(例如服务停止或重新启动)而导致时,服务将不会重新启动。超时包括错过看门狗“keep-alive ping”截止时间以及服务启动、重新加载和停止操作超时。

请注意,重新启动仅指设备本身的进程。

而例如对于Wants=手动的

如果配置单元已启动,则将启动此选项中列出的单元。但如果列出的单元启动失败或无法添加到交易中,则不会影响整个交易的有效性,该单元仍会启动。这是将一个单元的启动与另一个单元的启动挂钩的推荐方法。

请注意,其他单元部分Restart=中没有提及选项。[Service]


为了完全抑制服务被其他单元调用重新启动,我想到了两个选择:

1. 删除对本机的所有呼叫

很明显,这意味着更改所有调用单元并删除Wants=类似的引用,也许在启动时保留调用。

2. 即使过程失败,也要使单位成功

您可以直接取代该流程以始终成功:

ExecStart=/bin/bash -c '/path/to/executable || true'

当然,您不会知道可执行文件是否通过systemd-query 失败。

相关内容