다양한 소스에서 내가 모은 내용은 다음과 같습니다 ~/.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
이것을 사용하여 활성화했습니다 systemctl --user enable screenlock.service
. 하지만 다시 시작한 후 로그인하고 일시 중지하고 다시 시작합니다( systemctl suspend
뚜껑을 닫아 테스트).화면이 잠금 해제되었으며 콘텐츠가 없습니다.journalctl --user-unit screenlock.service
.내가 뭘 잘못했나요?
실행하면 DISPLAY=:0 /usr/bin/xautolock -locknow
예상대로 화면이 잠깁니다.
$ 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
즉시 화면 잠금을 실행 했는데 systemctl --user start screenlock.service
로그 메시지가 표시된다면 journalctl --user-unit screenlock.service
이는 ExecStart
분명히 올바른 것입니다.
xautolock -locker slock &
동일한 파일을 사용하여 시스템 서비스 생성일하다( slock
즉, 복원 시 활성화됨):
# ln -s "${HOME}/.config/systemd/user/screenlock.service" /usr/lib/systemd/system/screenlock.service
# systemctl enable screenlock.service
$ systemctl suspend
$HOME
하지만 다음과 같은 이유로 사용자별 파일을 외부에 추가하고 싶지 않습니다 .
- 사용자 서비스는 시스템 서비스와 명확하게 분리되어야 합니다.
- 슈퍼유저 권한을 사용하지 않고 사용자 서비스를 제어해야 합니다.
- 구성은 버전 관리가 쉬워야 합니다.
답변1
sleep.target
시스템 서비스에만 해당됩니다. 그 이유는 sleep.target
자고 있는 동안 자동으로 활성화되는 마법의 대상이 아니기 때문이다. 이건 그냥 평범한 목표야풋옵션시스템은 절전 모드로 전환됩니다. 따라서 "사용자" 인스턴스에는 동등한 인스턴스가 없습니다. (안타깝게도 "사용자" 인스턴스는 현재 시스템 전체 서비스에 의존할 수 없습니다.)
(이것이 전체 "하드코딩 $DISPLAY" 사업입니다. 다중 사용자/다중 좌석이 많은 Unix 기반 운영 체제에서 세션 매개변수를 하드코딩할 때마다 루트는 새끼 고양이를 죽입니다.)
따라서 이를 수행하는 두 가지 좋은 방법이 있습니다(두 번째 방법을 사용하는 것이 좋습니다).
방법 1
시스템이 절전 모드로 전환될 때 systemd-logind가 "모든 세션 잠금" 신호를 브로드캐스트하도록 하는 시스템 서비스(또는 systemd-sleep(8) 후크)를 만듭니다.
ExecStart=/usr/bin/loginctl lock-sessions
그런 다음 X11 세션(예: ~/.xinitrc)에서 신호에 반응하는 항목을 실행합니다.
시스템 잠금 핸들러수오허
xss 잠금--수면 잠금 무시&
(GNOME, Cinnamon, KDE 및 Enlightenment는 이미 이를 기본적으로 지원합니다.)
방법 2
X11 세션에서 다음을 실행하십시오.곧장예를 들어 systemd-logind의 "억제자"에 연결하여 시스템이 절전 모드로 들어가는 것을 지켜보세요.
앞서 언급한 xss-lock은 실제로 명시적인 "모두 잠금" 신호 없이도 이 작업을 수행하므로 실행하도록 놔두는 것만으로도 충분합니다.
xss 잠금수오허
slock
systemd-logind가 컴퓨터를 일시 중지할 준비가 된 것을 확인하자마자 실행됩니다.
답변2
systemd-lock-handler
이 작업을 수행할 수 있는 Python 스크립트는 다음과 같습니다.
https://github.com/grawity/code/blob/master/desktop/systemd-lock-handler.
#!/usr/bin/env python
# systemd-lock-handler -- proxy between systemd-logind's "Lock" signal and your
# favourite screen lock command
from __future__ import print_function
import os, sys, dbus, dbus.mainloop.glib
from gi.repository import GLib
def trace(*args):
global arg0
print("%s:" % arg0, *args)
def setup_signal(signal_handler):
global session_id
bus = dbus.SystemBus()
manager = bus.get_object("org.freedesktop.login1", "/org/freedesktop/login1")
# yecch
manager = dbus.Interface(manager, "org.freedesktop.login1.Manager")
session_path = manager.GetSession(session_id)
session = bus.get_object("org.freedesktop.login1", session_path)
session.connect_to_signal("Lock", signal_handler)
def handler_dbus_fdo():
trace("locking session using DBus")
bus = dbus.SessionBus()
screensaver = bus.get_object("org.freedesktop.ScreenSaver", "/ScreenSaver")
screensaver.Lock()
def handler_external():
global lock_command
trace("locking session using %r" % lock_command[0])
os.spawnvp(os.P_NOWAIT, lock_command[0], lock_command)
def main():
global arg0, lock_command, session_id
arg0 = sys.argv[0].split("/")[-1]
lock_command = sys.argv[1:] or ["--dbus"]
try:
session_id = os.environ["XDG_SESSION_ID"]
except KeyError:
print("error: $XDG_SESSION_ID not set; are you using pam_systemd?",
file=sys.stderr)
sys.exit(1)
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
if lock_command == ["--dbus"]:
trace("using freedesktop.org DBus API")
setup_signal(handler_dbus_fdo)
else:
trace("using external command %r" % lock_command[0])
setup_signal(handler_external)
trace("waiting for lock signals on session %s" % session_id)
try:
loop = GLib.MainLoop()
loop.run()
except KeyboardInterrupt:
sys.exit(0)
main()