我正在开发类似的东西活动观察,一个守护进程,记录我正在做什么以及我在桌面上活动的时间。我希望它在我登录时启动,在我注销或重新启动时被终止。
基本上有两种方法可以解决此问题:
systemd --user
通过将.service
文件放入来使用.config/systemd/user
。.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 方法发挥作用。我发现两个问题:
- dbus 服务确实已启动,但我的应用程序启动时出现 dbus 错误。有没有办法告诉 systemd 在桌面完全准备就绪时启动应用程序?
- 如果我注销,服务不会终止。如果我再次登录,服务也不会重新启动。
我看到的 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