How to run systemd user service to trigger on sleep (aka. suspend, hibernate)?
sleep.target
is specific to system services. The reason is, sleep.target
is not a magic target that automatically gets activated when going to sleep. It's just a regular target that puts the system to sleep – so the 'user' instances of course won't have an equivalent. (And unfortunately the 'user' instances currently have no way to depend on systemwide services.)
(That, and there's the whole "hardcoding $DISPLAY" business. Every time you hardcode session parameters in an OS that's based on the heavily multi-user/multi-seat Unix, root kills a kitten.)
So there are two good ways to do this (I suggest the 2nd one):
Method 1
Create a system service (or a systemd-sleep(8) hook) that makes systemd-logind broadcast the "lock all sessions" signal when the system goes to sleep:
ExecStart=/usr/bin/loginctl lock-sessions
Then, within your X11 session (i.e. from ~/.xinitrc), run something that reacts to the signal:
systemd-lock-handler slock &
xss-lock --ignore-sleep slock &
(GNOME, Cinnamon, KDE, Enlightenment already support this natively.)
Method 2
Within your X11 session, run something that directly watches for the system going to sleep, e.g. by hooking into systemd-logind's "inhibitors".
The aforementioned xss-lock actually does exactly that, even without the explicit "lock all" signal, so it is enough to have it running:
xss-lock slock &
It will run slock
as soon as it sees systemd-logind preparing to suspend the computer.