Berdasarkan berbagai sumber saya telah dirakit ~/.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
Saya sudah mengaktifkannya menggunakan systemctl --user enable screenlock.service
. Tetapi setelah reboot, masuk, menangguhkan dan melanjutkan (diuji dengan systemctl suspend
dan dengan menutup tutupnya) layar tidak terkunci dan tidak ada apa-apa di dalamnyajournalctl --user-unit screenlock.service
. Apa yang saya lakukan salah?
Menjalankan DISPLAY=:0 /usr/bin/xautolock -locknow
mengunci layar seperti yang diharapkan.
$ 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
Jika saya menjalankan systemctl --user start screenlock.service
kunci layar segera dan saya mendapatkan pesan log journalctl --user-unit screenlock.service
, jadi ExecStart
jelas sudah benar.
xautolock -locker slock &
Membuat layanan sistem dengan file yang sama berfungsi (yaitu, slock
aktif saat melanjutkan):
# ln -s "${HOME}/.config/systemd/user/screenlock.service" /usr/lib/systemd/system/screenlock.service
# systemctl enable screenlock.service
$ systemctl suspend
Tetapi saya tidak ingin menambahkan file khusus pengguna di luar $HOME
karena beberapa alasan:
- Layanan pengguna harus dipisahkan dengan jelas dari layanan sistem
- Layanan pengguna harus dikontrol tanpa menggunakan hak pengguna super
- Konfigurasi harus mudah dikendalikan versi
systemd-user
masih sangat rapuh; membuatnya berfungsi sebagai bagian dari sesi melalui pendekatan yang saya uraikan akan membantu mempersempit masalah; hanya itu yang bisa saya sarankan./etc/systemd/system/
atau$HOME/.local/systemd/system
menghindari memasukkan apa pun ke dalam/usr
manual. Seperti @jasonwryan sebutkan, sesi pengguna masih belum dianggap berkualitas produksi; tapi mereka semakin dekat.Jawaban:
sleep.target
khusus untuk layanan sistem. Alasannya,sleep.target
bukan target ajaib yang secara otomatis akan diaktifkan ketika akan tidur. Ini hanya target reguler yang membuat sistem tidur - jadi contoh 'pengguna' tentu saja tidak akan memiliki yang setara. (Dan sayangnya instans 'pengguna' saat ini tidak memiliki cara untuk bergantung pada layanan seluruh sistem.)(Itu, dan ada seluruh bisnis "hardcoding $ DISPLAY". Setiap kali Anda melakukan hardcode pada parameter sesi di OS yang didasarkan pada Unix yang sangat multi-pengguna / multi-kursi, root membunuh anak kucing.)
Jadi ada dua cara yang baik untuk melakukan ini (saya sarankan yang ke-2):
Metode 1
Buat layanan sistem (atau kait systemd-sleep (8)) yang membuat systemd-logind menyiarkan sinyal "kunci semua sesi" ketika sistem tidur:
Kemudian, dalam sesi X11 Anda (yaitu dari ~ / .xinitrc), jalankan sesuatu yang bereaksi terhadap sinyal:
(GNOME, Cinnamon, KDE,
Enlightenmentsudah mendukung ini secara asli.)Metode 2
Dalam sesi X11 Anda, jalankan sesuatu yang secara langsung mengawasi sistem akan tidur, misalnya dengan menghubungkan ke "inhibitor" systemd-logind.
Xss-lock yang disebutkan di atas sebenarnya melakukan hal itu, bahkan tanpa sinyal "kunci semua" yang eksplisit, sehingga cukup untuk menjalankannya:
Ini akan berjalan
slock
segera setelah melihat systemd-logind bersiap untuk menangguhkan komputer.sumber
xss-lock
ada di AUR, jadi tidak perlu membuatnya secara manual.systemd-lock-handler
adalah skrip Python yang dapat melakukan ini: https://github.com/grawity/code/blob/master/desktop/systemd-lock-handler .sumber