ExecStart 有“-”前缀,但单元仍然失败

ExecStart 有“-”前缀,但单元仍然失败

我已经覆盖了 dnf-makecache,以便每次互联网出现问题时都不会让我的系统处于故障状态(令人震惊!)但它似乎被忽略了。

# sc cat dnf-makecache.service
# /usr/lib/systemd/system/dnf-makecache.service
[Unit]
Description=dnf makecache
# On systems managed by either rpm-ostree/ostree, dnf is read-only;
# while someone might theoretically want the cache updated, in practice
# anyone who wants that could override this via a file in /etc.
ConditionPathExists=!/run/ostree-booted

After=network-online.target

[Service]
Type=oneshot
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Environment="ABRT_IGNORE_PYTHON=1"
ExecStart=/usr/bin/dnf makecache --timer

# /etc/systemd/system/dnf-makecache.service.d/override.conf
[Service]
ExecStart=-/usr/bin/dnf makecache --timer
[root@lxd10 ~]# man systemd.service
[root@lxd10 ~]# sc cat dnf-makecache
# /usr/lib/systemd/system/dnf-makecache.service
[Unit]
Description=dnf makecache
# On systems managed by either rpm-ostree/ostree, dnf is read-only;
# while someone might theoretically want the cache updated, in practice
# anyone who wants that could override this via a file in /etc.
ConditionPathExists=!/run/ostree-booted

After=network-online.target

[Service]
Type=oneshot
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Environment="ABRT_IGNORE_PYTHON=1"
ExecStart=/usr/bin/dnf makecache --timer

# /etc/systemd/system/dnf-makecache.service.d/override.conf
[Service]
ExecStart=-/usr/bin/dnf makecache --timer

但仍然失败,系统状态降级

Jun 28 09:08:35 lxd10.2e-systems.com systemd[1]: dnf-makecache.service: Main process exited, code=exited, status=1/FAILURE
Jun 28 09:08:35 lxd10.2e-systems.com systemd[1]: dnf-makecache.service: Failed with result 'exit-code'.
Jun 28 09:08:35 lxd10.2e-systems.com systemd[1]: Failed to start dnf makecache.

但手册明确指出,如果 exec 路径以破折号为前缀,则退出代码将被忽略。我做错了什么?可能是因为它是由计时器运行的?

答案1

systemd.service(5)

除非Type=oneshot,否则必须给出一个命令。Type=oneshot使用时 ,可以指定零个或多个命令。可以通过在同一个指令中提供多个命令行来指定命令,或者,可以多次指定该指令并达到相同的效果。如果为此选项分配空字符串,则要启动的命令列表将被重置,此选项的先前分配将不起作用。
[...]

同样,从systemd.unit(5)

注意用于插入文件,如果有人想从解析为列表的设置中删除条目(并且不是依赖项),例如 AssertPathExists=(或例如ExecStart=在服务单位),需要 首先清除列表,然后重新添加除要删除的条目之外的所有条目。
[...]

因此,对于当前 OP 的override.conf文件,由于类型为单次触发ExecStart=现在是一个双元素列表:/usr/bin/dnf makecache --timer-/usr/bin/dnf makecache --timer然后适用:

如果指定了多个命令,命令按照它们在单元文件中出现的顺序依次调用。如果其中一个命令失败(且不以“-”为前缀),则不会执行其他行,并且该单元被视为失败。

由于原来的命令没有了-仍然会执行,所以当它失败时服务就会失败。

代替其中,该override.conf文件应该包含如下内容:

[Service]
ExecStart=
ExecStart=-/usr/bin/dnf makecache --timer

相关内容