systemctl --user 与 .config/autostart/*.desktop - 何时使用哪个?

systemctl --user 与 .config/autostart/*.desktop - 何时使用哪个?

我正在开发类似的东西活动观察,一个守护进程,记录我正在做什么以及我在桌面上活动的时间。我希望它在我登录时启动,在我注销或重新启动时被终止。

基本上有两种方法可以解决此问题:

  1. systemd --user通过将.service文件放入来使用.config/systemd/user
  2. .desktop通过将文件放入其中来从桌面启动~/.config/autostart

我的问题是:其中一种方法是否天生就比另一种“更好”?我应该记录哪种方法,哪种方法更有可能在更多地方使用并且更经得起未来考验?

细节

这是我目前所得到的。

.config/autostart/actlog.desktop

[Desktop Entry]
Version=1.0
Name=Actlog
GenericName=Actlog something
Exec=/home/pmorch/work/venvs/test/bin/actlog daemon --monitor-start-only
Terminal=false
Type=Application
Categories=Utility;Application;
X-GNOME-Autostart-enabled=true

这立即就起作用了。

.config/systemd/user/actlog.service

[Unit]
Description=ActLog user activity monitoring
After=dbus.service

[Service]
Type=simple
StandardOutput=journal
ExecStart=/home/pmorch/work/venvs/test/bin/actlog daemon --monitor-start-only

[Install]
WantedBy=graphical-session.target

说实话,我很难让 systemd --user 方法发挥作用。我发现两个问题:

  1. dbus 服务确实已启动,但我的应用程序启动时出现 dbus 错误。有没有办法告诉 systemd 在桌面完全准备就绪时启动应用程序?
  2. 如果我注销,服务不会终止。如果我再次登录,服务也不会重新启动。

我看到的 dbus 错误例如The name org.freedesktop.ScreenSaver was not provided by any .service files- 如果我在.service文件中休眠 60 秒,它就会正常启动。但这是一种黑客行为。

我猜我最终可以让它工作,但这些问题也许表明 systemd --user 不适合这种用例。你怎么看?

答案1

一般来说,如果您的应用程序使用或依赖图形资源,最好使用自动启动方法。它不应该在桌面准备好启动应用程序之前启动应用程序。

如果你确实使用 systemctl,使用 可能会有所帮助after=something.target。你可以使用 获取潜在目标列表systemctl --user --type=target,以下目标看起来很有希望:

gnome-session-initialized.target 
gnome-session-initialized.target
gnome-session-manager.target
graphical-session.target

添加最后一个wants=将导致您的服务加载,但它可能会在会话完全启动之前加载,after=并且我不清楚哪一个目标最适合 after=。

如果您在轮询屏幕保护程序时遇到问题,将以下任一内容放在 after= 行上可能会有所帮助

org.gnome.SettingsDaemon.ScreensaverProxy.service
org.gnome.SettingsDaemon.ScreensaverProxy.target

相关内容