Com base em várias fontes que eu juntei ~/.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
Eu o habilitei usando systemctl --user enable screenlock.service
. Porém, após a reinicialização, o login, a suspensão e a continuação (testados com systemctl suspend
e fechando a tampa) a tela não está bloqueada e não há nadajournalctl --user-unit screenlock.service
. O que estou fazendo de errado?
A execução DISPLAY=:0 /usr/bin/xautolock -locknow
bloqueia a tela conforme o esperado.
$ 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
Se eu executar systemctl --user start screenlock.service
os bloqueios de tela imediatamente e receber uma mensagem de logon journalctl --user-unit screenlock.service
, isso ExecStart
estará claramente correto.
xautolock -locker slock &
A criação de um serviço do sistema com o mesmo arquivo funciona (ou seja, slock
fica ativa ao retomar):
# ln -s "${HOME}/.config/systemd/user/screenlock.service" /usr/lib/systemd/system/screenlock.service
# systemctl enable screenlock.service
$ systemctl suspend
Mas não quero adicionar um arquivo específico do usuário fora $HOME
por vários motivos:
- Os serviços do usuário devem ser claramente separados dos serviços do sistema
- Os serviços do usuário devem ser controlados sem o uso de privilégios de superusuário
- A configuração deve ser facilmente controlada por versão
systemd-user
ainda é muito esquisito; fazê-lo funcionar como parte da sessão por meio da abordagem que descrevi ajudaria a diminuir o problema; é tudo o que posso sugerir./etc/systemd/system/
ou$HOME/.local/systemd/system
evitar colocar qualquer coisa/usr
manualmente. Como o @jasonwryan mencionou, as sessões do usuário ainda não são consideradas como qualidade de produção; mas eles estão se aproximando.Respostas:
sleep.target
é específico para os serviços do sistema. O motivo é quesleep.target
não é um alvo mágico que é ativado automaticamente quando você dorme. É apenas um alvo comum que coloca o sistema no modo de suspensão - para que as instâncias de 'usuário' obviamente não tenham um equivalente. (E, infelizmente, as instâncias de 'usuário' atualmente não têm como depender de serviços em todo o sistema.)(Isso e existe toda a empresa "codificar $ DISPLAY". Toda vez que você codifica os parâmetros da sessão em um sistema operacional baseado no Unix altamente multiusuário / multi-banco, a raiz mata um gatinho.)
Portanto, existem duas boas maneiras de fazer isso (sugiro a segunda):
Método 1
Crie um serviço do sistema (ou um gancho systemd-sleep (8)) que faça o systemd-logind transmitir o sinal "bloquear todas as sessões" quando o sistema entrar em suspensão:
Então, dentro da sua sessão X11 (ou seja, de ~ / .xinitrc), execute algo que reaja ao sinal:
(GNOME, Canela, KDE,
Iluminismojá suportam isso nativamente.)Método 2
Na sua sessão do X11, execute algo que observe diretamente o sistema entrar em suspensão, por exemplo, conectando os "inibidores" do systemd-logind.
O xss-lock acima mencionado, na verdade, faz exatamente isso, mesmo sem o sinal explícito "bloquear tudo", portanto é suficiente fazê-lo funcionar:
Ele será executado
slock
assim que o systemd-logind estiver se preparando para suspender o computador.fonte
xss-lock
está no AUR, portanto não há necessidade de construí-lo manualmente.systemd-lock-handler
é um script Python que pode fazer isso: https://github.com/grawity/code/blob/master/desktop/systemd-lock-handler .fonte