依赖于系统单位的 systemd 用户单位 (sleep.target)

Ale*_*aev 21 systemd

我正在阅读文档,但我仍然不清楚是否可以完成以下操作:

中定义的服务~/.config/systemd/user/task.service依赖于系统sleep.target(~/.config/systemd/user/sleep.target.wants/task.service)。

现在我希望task.service在我运行时启动$ systemctl suspend,但是task.service没有启动。

我正在运行 debian,使用 systemd 版本 208,systemd --user配置或多或少如ArchWiki 所述。

我不知道是否我的情况可能与systemd在所有来实现,或者是--system和--user设计完全隔离,使--user单元可能不是一个的依赖--system单位。

如果可能,我的情况可能有什么问题?

ssh*_*how 11

来自systemd/用户 - Archwiki

systemd --user作为独立于进程的systemd --system进程运行。用户单位不能参考或依赖系统单位。

  • 这很糟糕。这太糟糕了。 (9认同)
  • 我刚刚被这个咬了。问题是,“systemctl --user daemon-reload”不会报告用户服务文件中存在无用的依赖项。 (5认同)

小智 7

您还可以为服务和用户实例之间的所有睡眠/挂起目标创建“代理”。

在以下位置创建此文件/etc/systemd/system/suspend@.service:

[Unit]
Description=Call user's suspend target after system suspend
After=suspend.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --user --machine=%i@ start --wait suspend.target

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

并通过运行启用它sudo systemctl daemon-reload && sudo systemctl enable suspend@youruser。

现在创建您的suspend.target用户~/.config/systemd/user/suspend.target:

[Unit]
Description=User level suspend target
StopWhenUnneeded=yes
Wants=my-etc-service.service
Run Code Online (Sandbox Code Playgroud)

然后将您的服务添加到Wants列表中并确保运行systemctl --user daemon-reload


rem*_*mmy 5

systemd用户会话服务在一个完全独立的实例中运行systemd,并且没有任何方式直接依赖于系统服务。

不过,还有其他方法可以完成您想要的操作。最干净的方法可能是在系统进入 sleep 时让您想要运行的任何内容挂钩到logind的抑制剂,然后将其作为后台守护程序运行。

一个更通用的解决方案是让一个守护进程挂钩到logind抑制剂中,(请参阅systemd-lock-handler和xss-lock,)然后当系统进入睡眠状态时,它将激活一个用户会话目标,您可以订购您的服务在下面。