如何執行 systemd 使用者服務以觸發睡眠(又名掛起、休眠)?
根據我拼湊在一起的各種來源
~/.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
但出於以下幾個原因,我不想在外部添加特定於使用者的文件:
- 使用者服務應與系統服務明確分離
- 應該在不使用超級使用者權限的情況下控制使用者服務
- 配置應該易於版本控制
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 準備掛起電腦,它將立即執行。