我有一个正在测试的测试 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
如果我做
systemctl start test
它将首先启动 MariaDB,然后启动我的脚本。但是,如果我屏蔽了 MariaDB(我执行了 systemctl mask mariadb),那么 MariaDB 将无法启动,但 systemd 将启动 test.sh。它不应该因为启动必需的进程(在本例中是 MariaDB)而失败吗?
答案1
这是 systemd 中的一个错误。我已提交错误报告并分析了此处的错误:https://github.com/systemd/systemd/issues/11338
这个问题在这里表现为目标在需要= 屏蔽单元的单元上获得 Wants=。事务已构建,systemd 已为锚定单元(其 Wants= 依赖项)添加作业,并且在您的情况下获得 -ERFKILL 时不会将其删除,并且将其传播到为 UNIT_WANTS 调用的函数会忽略它(因为它不是致命错误),因此即使所需单元被屏蔽,您最终也会启动该单元。
在许多其他情况下也会发生这种情况,例如不存在路径的 RequiresMountsFor= 等。BindsTo= 也是如此。
我尝试过从下往上遍历,但这会导致另一个问题:如果某个单元 Requires=existing.service non-existent.service,它仍会将虚假作业排入队列,因此这种作业添加在某种程度上需要是原子的。此外,它可能不会将虚假作业排入队列,具体取决于您指定事物的顺序。
无论如何,请考虑解决该 GitHub 问题,并解释您是如何解决它的。