我有一项服务,那就是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 失败。