我有一个正在测试的测试 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?
这是 systemd 中的一个错误。我已经提交了一个错误报告并分析了这里的错误:https : //github.com/systemd/systemd/issues/11338
这个问题在这里表现出来,因为目标在需要= 蒙面单位的单位上获得了一个 Wants=。事务已构建并且 systemd 已经为锚单元添加了一个作业,它的 Wants= 依赖项,并且在您的情况下获得 -ERFKILL 时不会将其删除,并将其传播到为 UNIT_WANTS 调用的函数会忽略它(因为它不是致命错误),因此即使屏蔽了所需的单元,您最终也会启动该单元。
许多其他情况会发生这种情况,例如 RequiresMountsFor= 表示不存在的路径等。 BindsTo= 也是如此。
自下而上的遍历是我玩过的东西,但这会导致另一个问题:如果某个单元 Requires=existing.service non-existent.service,它仍然会排队一个虚假的工作,所以这个工作的添加需要在某种程度上是原子的。此外,它可能不会将虚假作业排入队列,具体取决于您指定的顺序。
不管怎样,考虑一下 GitHub 问题,并解释你是如何解决它的。
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |