Basierend auf verschiedenen Quellen habe ich zusammengeschustert ~/.config/systemd/user/screenlock.service
:
[Unit]
Description=Lock X session
Before=sleep.target
[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xautolock -locknow
[Install]
WantedBy=sleep.target
Ich habe es mit aktiviert systemctl --user enable screenlock.service
. Aber nach dem Neustart, Einloggen, Anhalten und Wiederaufnehmen (getestet mit systemctl suspend
und durch Schließen des Deckels) ist der Bildschirm nicht gesperrt und es ist nichts drinjournalctl --user-unit screenlock.service
. Was mache ich falsch?
Beim Ausführen wird DISPLAY=:0 /usr/bin/xautolock -locknow
der Bildschirm wie erwartet gesperrt.
$ systemctl --version
systemd 215
+PAM -AUDIT -SELINUX -IMA -SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ +SECCOMP -APPARMOR
$ awesome --version
awesome v3.5.5 (Kansas City Shuffle)
• Build: Apr 11 2014 09:36:33 for x86_64 by gcc version 4.8.2 (nobody@)
• Compiled against Lua 5.2.3 (running with Lua 5.2)
• D-Bus support: ✔
$ slim -v
slim version 1.3.6
Wenn ich systemctl --user start screenlock.service
den Bildschirm sofort sperre und eine Logmeldung bekomme journalctl --user-unit screenlock.service
, ist das ExecStart
eindeutig richtig.
Relevanter .xinitrc
Abschnitt :
xautolock -locker slock &
Das Erstellen eines Systemdienstes mit derselben Datei funktioniert (dh, er slock
ist aktiv, wenn der Vorgang fortgesetzt wird):
# ln -s "${HOME}/.config/systemd/user/screenlock.service" /usr/lib/systemd/system/screenlock.service
# systemctl enable screenlock.service
$ systemctl suspend
Ich möchte jedoch $HOME
aus mehreren Gründen keine benutzerspezifische Datei außerhalb hinzufügen :
- Benutzerdienste sollten klar von Systemdiensten getrennt sein
- Benutzerdienste sollten ohne Verwendung von Superuser-Berechtigungen gesteuert werden
- Die Konfiguration sollte leicht versionskontrollierbar sein
systemd-user
ist immer noch sehr schuppig; Es würde helfen, das Problem einzugrenzen, indem man es im Rahmen der Sitzung über den von mir beschriebenen Ansatz zum Laufen bringt. Das ist alles, was ich vorschlagen kann./etc/systemd/system/
oder$HOME/.local/systemd/system
vermeiden, etwas/usr
manuell einzugeben. Wie @jasonwryan bereits erwähnt hat, werden Benutzersitzungen immer noch nicht als Produktionsqualität angesehen. aber sie kommen näher.Antworten:
sleep.target
ist spezifisch für Systemdienste. Der Grund dafür ist, dasssleep.target
es sich nicht um ein magisches Ziel handelt, das beim Einschlafen automatisch aktiviert wird. Es ist nur ein reguläres Ziel, das das System in den Energiesparmodus versetzt. Die "Benutzer" -Instanzen verfügen also natürlich nicht über ein Äquivalent. (Leider können sich die Benutzerinstanzen derzeit nicht auf systemweite Dienste verlassen.)(Das und das ganze "hardcoding $ DISPLAY" -Geschäft. Jedes Mal, wenn Sie Sitzungsparameter in einem Betriebssystem fest codieren, das auf dem Unix mit vielen Benutzern und mehreren Sitzen basiert, tötet root ein Kätzchen.)
Dafür gibt es zwei gute Möglichkeiten (ich schlage die zweite vor):
Methode 1
Erstellen Sie einen Systemdienst (oder einen systemd-sleep (8) -Hook), mit dem systemd-logind das Signal "Alle Sitzungen sperren" sendet, wenn das System in den Ruhezustand wechselt:
Führen Sie dann in Ihrer X11-Sitzung (dh von ~ / .xinitrc) etwas aus, das auf das Signal reagiert:
(GNOME, Cinnamon, KDE,
Enlightenmentunterstützen dies bereits von Haus aus.)Methode 2
Führen Sie in Ihrer X11-Sitzung etwas aus, das direkt darauf wartet , dass das System in den Ruhezustand versetzt wird, z. B. indem Sie sich in die "Inhibitoren" von systemd-logind einhängen.
Das oben erwähnte xss-lock macht eigentlich genau das, auch ohne das explizite "lock all" Signal, es reicht also aus, es laufen zu lassen:
Es wird ausgeführt
slock
, sobald systemd-logind sich darauf vorbereitet, den Computer anzuhalten.quelle
xss-lock
ist in der AUR enthalten, daher muss sie nicht manuell erstellt werden.systemd-lock-handler
ist ein Python-Skript, das dies ausführen kann: https://github.com/grawity/code/blob/master/desktop/systemd-lock-handler .quelle