我已经覆盖了 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
除非
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