como executar um script de usuário após a ativação do systemd?

10

Quando minha caixa de área de trabalho debian jessie acorda do modo de suspensão (por meio do novo sistema brilhante) minhas configurações de mouse são retornadas aos seus padrões, tendo redefinido minha personalização

xinput set-prop 12 'Device Accel Constant Deceleration' 2.5

que é executado quando eu entro.

como posso executar um script de usuário arbitrário ao ativar? (suponha que o usuário seja o proprietário da sessão X)

Tanto quanto me lembro, o seguinte é a única personalização que fiz da systemdinstalação (sim, eu sei que é completamente errado, porque não funciona para usuários arbitrários, mas ainda não descobri como fazer isso. ... isso está um pouco relacionado)

Além disso, como posso executar um script de usuário arbitrário antes da ativação, como o usuário que está atualmente usando a tela X?

cat /etc/systemd/system/i3lock.service

#systemctl enable i3lock.service

[Unit]
Description=i3lock
Before=sleep.target

[Service]
User=fommil
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock -c 000000

[Install]
WantedBy=sleep.target
fommil
fonte
askubuntu.com/a/661747 Isso me ajuda no meu caso, que é diferente do seu. Talvez possa ser útil para você.
21717 Sun Bear

Respostas:

5

Esta resposta é baseada em askubuntu.com/a/661747/394818 (como também referido no comentário por @ sun-bear), askubuntu.com/q/616272/394818 e superuser.com/a/1269158/585953 .

Usando um serviço do sistema:

Crie o arquivo /etc/systemd/system/my_user_script.service:

[Unit]
Description=Run my_user_script
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target


[Service]
ExecStart=/path/to/my_user_script
#User=my_user_name
#Environment=DISPLAY=:0

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

Remova suspender / hibernar / híbrido, caso o serviço só deva ser executado depois de acordar de um tipo específico de suspensão. No caso do serviço precisa ser executado por um usuário específico, descomente a User=e Environment=linhas e substituir o nome de usuário relevante.

Instale o arquivo de serviço com:

sudo systemctl enable my_user_script

O uso de um serviço de usuário não funcionará:

Para evitar definir um nome de usuário codificado com User=, pode-se criar exatamente o mesmo arquivo de serviço .local/share/systemd/user/my_user_script.servicee ativar com

systemctl --user enable my_user_script

No entanto, isso não vai funcionar. O @grawity explica com mais detalhes em unix.stackexchange.com/a/174837/163108 por que isso é:

sleep.targeté específico para os serviços do sistema. O motivo é que sleep.targetnã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.)

davidovitch
fonte
3

Criei um arquivo em / lib / systemd / system-sleep .

#!/bin/sh
case $1 in
  post)
    /bin/runme
  ;;
esac

A postagem é chamada na ativação.

EDITAR:

https://www.freedesktop.org/software/systemd/man/systemd-suspend.service.html

gam3
fonte
1
Isso não funcionou para mim. Você pode criar um link para alguma documentação explicando como deve funcionar?
precisa
Isso também não funciona para mim. O contexto em que esse script é executado é extremamente limitado e não é executado como o usuário que estava ativo quando o sistema entrou no modo de suspensão. Portanto, ele não obtém acesso à tela (que exclui a maioria dos utilitários de área de trabalho aqui), informações / variáveis ​​para o usuário que está conectado ou qualquer outra coisa relacionada à sessão do usuário que está conectado no momento. Preciso de um script para executar como o usuário que está conectado dentro do contexto da sessão da área de trabalho. Ainda não encontrei nada para fazer isso, mas atualizarei aqui se o fizer.
theferrit32
@ theferrit32, você poderá mudar para seu usuário preferido com o comando 'su' de dentro do seu script.
borizzzzz
1

Abra este arquivo:

sudo vim / lib / systemd / system-sleep / hdparm

Conteúdo:

#! / bin / sh

caso $ 1 na postagem)
    /usr/lib/pm-utils/power.d/95hdparm-apm resume
    ## Cole seu comando para executar seu script
    ;; esac

Seu comando será executado com privilégios de administrador .

Abhishek Singh
fonte