[systemd-devel] Using systemd --user to manage graphical sessions?
Luke Shumaker
lukeshu at sbcglobal.net
Wed May 11 22:28:58 UTC 2016
On Wed, 11 May 2016 12:13:45 -0400,
Martin Pitt wrote:
> Or is someone actually using systemd --user for graphical sessions
> already and found a trick that I missed?
I am! For several months now (and before that, I was still using
systemd --user for graphical stuff, but not consistently/coherently).
My configuration: https://lukeshu.com/git/dotfiles/tree/.config
Crappy write-up: https://lukeshu.com/blog/x11-systemd.html
One thing to note is that I don't use a DE, and have minimal
bus-activated services.
The big difference between what I do and what you wrote is that I
don't tie the DISPLAY name to the XDG_SESSION_ID (actually, the
session ID isn't even set in the graphical session).
The short version of how I have it work:
My ~/.xinitrc (AKA: script that starts the initial X11 clients)
contains:
_DISPLAY="$(systemd-escape -- "$DISPLAY")"
mkfifo "${XDG_RUNTIME_DIR}/x11-wm@${_DISPLAY}"
cat < "${XDG_RUNTIME_DIR}/x11-wm@${_DISPLAY}" &
systemctl --user start "X11@${_DISPLAY}.target" &
wait
systemctl --user stop "X11@${_DISPLAY}.target"
Which basically says: start X11@:0.target, wait for something to open
"${XDG_RUNTIME_DIR}/x11-wm@${_DISPLAY}" for writing and then close it,
then stop X11@:0.target. Then I have my window manager configured to
open/close the file when I want to quit X11/log out (really, I have it
open at start, then just exit on quit; implicitly closing it).
Then, each of the whatever@${DISPLAY}.service files contains:
[Unit]
After=X11@%i.target
Requisite=X11@%i.target
[Service]
Environment=DISPLAY=%I
Now, when I launch a program from the window manager, I have it launch
with `systemd-run --user --scope -- sh -c "COMMAND HERE"`, so that
systemd can tell the difference between it and the window manager. I
imagine that this would be problematic with less configurable window
managers.
As I type this, I have two graphical logins to the same user. One on
a real screen, and the other with a fake screen via `vncserver` (of
course, managed as a systemd user unit :-) ).
The only problem I have with this setup is that dunst (my desktop
notification daemon) isn't happy running multiple instances on
different displays. I think it's because it isn't happy sharing the
dbus, but I haven't spent even 1 minute debugging it yet.
--
Happy hacking,
~ Luke Shumaker
More information about the systemd-devel
mailing list