systemd 启动服务即使需要的服务也不会启动

Dov*_*der 4 linux systemd

我有一个正在测试的测试 systemd 服务。我有 test.service 看起来像这样

[Unit]
Description=Dovid Demo Service
After=mariadb.service
Requires=mariadb.service

[Service]
ExecStart=/home/dovid/test.sh
User=dovid
Group=dovid

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

如果我做

systemctl start test
Run Code Online (Sandbox Code Playgroud)

它将首先启动 MariaDB,然后启动我的脚本。但是,如果我屏蔽了 MariaDB(我做了 systemctl mask mariadb),那么 MariaDB 将无法启动,systemd 将启动 test.sh。它不应该因为启动一个必需的进程而失败,在这种情况下是 MariaDB?

Jon*_*ski 5

这是 systemd 中的一个错误。我已经提交了一个错误报告并分析了这里的错误:https : //github.com/systemd/systemd/issues/11338

这个问题在这里表现出来,因为目标在需要= 蒙面单位的单位上获得了一个 Wants=。事务已构建并且 systemd 已经为锚单元添加了一个作业,它的 Wants= 依赖项,并且在您的情况下获得 -ERFKILL 时不会将其删除,并将其传播到为 UNIT_WANTS 调用的函数会忽略它(因为它不是致命错误),因此即使屏蔽了所需的单元,您最终也会启动该单元。

许多其他情况会发生这种情况,例如 RequiresMountsFor= 表示不存在的路径等。 BindsTo= 也是如此。

自下而上的遍历是我玩过的东西,但这会导致另一个问题:如果某个单元 Requires=existing.service non-existent.service,它仍然会排队一个虚假的工作,所以这个工作的添加需要在某种程度上是原子的。此外,它可能不会将虚假作业排入队列,具体取决于您指定的顺序。

不管怎样,考虑一下 GitHub 问题,并解释你是如何解决它的。