所以,我开始分解我的系统初始化并为我登录后想要加载的东西创建一些服务文件。这是常见的东西,比如 polybar、dunst 和其他东西。事情确实有效,但我的 pywal 设置存在一些问题。我已经将依赖项分离到一个单独的 .target 中,称为
主题.target
[Unit]
Description = Theme dependencies
BindsTo = xsession.target
Wants = pywal.service
Wants = i3.service
Wants = polybar.service
Wants = dunst.service
我想要实现的是仅在 pywal.service 完全运行并完成启动脚本的执行后才加载 i3(以及列表的其余部分)。
在 .bin/pywal 我确实睡了 10 秒
pywal.服务
[Unit]
Description = Run pywal service responsible for color schemes
PartOf = theme.target
[Service]
ExecStart = %h/.bin/pywal
[Install]
WantedBy = theme.target
i3.服务
[Unit]
Description = A tiling window manager
PartOf = theme.target
After = pywal.service
Requires = pywal.service
[Service]
ExecStart = /usr/bin/i3-msg restart
[Install]
WantedBy = theme.target
我可能在这里对“成功运行”的实际含义感到困惑,但是我注意到 i3 服务在我运行后立即重新启动
systemctl --user restart theme.target
然后我只是观察所有 3 个服务/目标的状态,并看到 i3 与 pywal.service 同时重新启动。
所以基本上我在这里错过了什么,为什么 i3 在 pywal 后 10 秒不重启?
编辑:根据评论修复了一个句子以在这种情况下更有意义
您对“成功运行”的理解与 systemd 的想法不匹配。对于诸如此类的服务,“类型”是“简单”,这意味着:
(我的重点)
这里的细微区别是时间安排之一:systemd 认为 pywal 单元在启动后立即启动,而您希望后续单元等到它“已完成启动脚本的执行”
%h/.bin/pywal
。因此,依赖项会在它们能够启动时立即启动(根据 systemd),这意味着 i3 将在 pywal 启动后很快启动,并且 pywal 可以随心所欲地休眠——它对i3的开始时间。
我相信这里的正确答案是让 pywal 成为 Type=Notify 并让它在准备好时通知 systemd。有关 systemd-notify 的更多信息,请参阅这些:
一种解决方法是使用ExecStartPre修改 i3 单元:
...强制实际 i3 可执行文件在运行前等待 10 秒。