Arch-Linux

如何執行 systemd 使用者服務以觸發睡眠(又名掛起、休眠)?

  • January 4, 2019

根據我拼湊在一起的各種來源~/.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顯然是正確的。

相關.xinitrc部分

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但出於以下幾個原因,我不想在外部添加特定於使用者的文件:

  • 使用者服務應與系統服務明確分離
  • 應該在不使用超級使用者權限的情況下控制使用者服務
  • 配置應該易於版本控制

sleep.target特定於系統服務。原因是,sleep.target不是在睡覺時自動啟動的魔法目標。它只是一個使系統進入睡眠狀態的正常目標——因此“使用者”實例當然不會有等價物。(不幸的是,“使用者”實例目前無法依賴系統範圍的服務。)

(這就是整個“硬編碼 $DISPLAY”業務。每次在基於大量多使用者/多座位 Unix 的作業系統中硬編碼會話參數時,root 都會殺死一隻小貓。)

所以有兩種很好的方法可以做到這一點(我建議第二種):

方法一

創建一個系統服務(或 systemd-sleep(8) 鉤子),使 systemd-logind 在系統進入睡眠狀態時廣播“鎖定所有會話”信號:

ExecStart=/usr/bin/loginctl lock-sessions

然後,在您的 X11 會話中(即來自 ~/.xinitrc),執行一些對信號作出反應的東西:

[systemd-lock-handler](https://nullroute.eu.org/+r/systemd-lock-handler) slock &
[xss-lock](https://bitbucket.org/raymonad/xss-lock/src) --ignore-sleep slock &

(GNOME、Cinnamon、KDE、Enlightenment已經原生支持。)

方法二

在您的 X11 會話中,執行一些直接監視系統進入睡眠狀態的東西,例如通過連接到 systemd-logind 的“抑製劑”。

前面提到的 xss-lock 實際上就是這樣做的,即使沒有明確的“全部鎖定”信號,所以讓它執行就足夠了:

[xss-鎖鎖](https://bitbucket.org/raymonad/xss-lock/src)&

slock一旦看到 systemd-logind 準備掛起電腦,它將立即執行。

引用自:https://unix.stackexchange.com/questions/149959