小编Mic*_*her的帖子

实际上是否存在指定“After=suspend.target”的 systemd 单元的竞争条件

关于在 resume 时启动 anacron 的 Debian 错误报告中,有人声称由于 systemd 依赖项的工作方式,此代码段(为简洁起见而简化)可能会在挂起而不是在恢复时触发。我无法理解使用 systemd 文档和 systemd 附带的单元文件指示的竞争条件。

[Unit]
Description=Do something at resume
After=suspend.target

[Service]
ExecStart=/bin/do-something

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

这篇文章的作者继续引用systemd-suspend.service,其中包含以下声明(再次精简为相关声明)

[Unit]
After=sleep.target
Requires=sleep.target
Run Code Online (Sandbox Code Playgroud)

其次是声称两个不同的单元,两个排序之后sleep.target并行运行,因此这两个单元之间没有排序。我完全同意这一点,但据我所知,没有两个单位都依赖于sleep.target。中的声明systemd-suspend.service确保sleep.target在进入睡眠之前完全启动,因此所有依赖于的单元sleep.target都已启动。但是查看suspend.target(原始单元文件真正依赖的目标),我发现以下声明:

[Unit]
BindsTo=systemd-suspend.service
After=systemd-suspend.service
Run Code Online (Sandbox Code Playgroud)

我将此文件理解为suspend.target仅在成功启动后才声明systemd-suspend.service成功启动。现在,systemd-suspend.service再次查看,我在该文件中找到以下声明:

[Service]
Type=oneshot
Exec=/lib/systemd/systemd-sleep suspend
Run Code Online (Sandbox Code Playgroud)

据我了解,一次性服务在Exec命令完成之前不会进入“已启动”状态。因此,任何订购After此服务的东西在systemd-sleep完成之前都不能开始。最后,看一下 systemd-sleep,它包含一些字符串的魔法写入到/sys/power/state,它会阻塞直到系统恢复。这应该确保所有想要在之后启动的东西systemd-suspend.service确实在恢复之前没有启动。

我声称写入/sys/power/state块的原因是该写入由该文件的 sysfs 存储函数处理,该函数调用 …

systemd

5
推荐指数
1
解决办法
883
查看次数

标签 统计

systemd ×1