Escrevendo o arquivo de unidade do systemd para suspensão / retomada

1

Toda vez que eu inicializo meu sistema, eu entro

# su
Password:
# hciattach -s 152000 /dev/ttyS1 billionton

Isso é necessário para inicializar meu mouse BT e depois de retomar da suspensão eu tenho que digitar o seguinte:

# su
Password:

Procurando por hciattach PID e matando-o

# pkill hciattach
# hciattach -s 152000 /dev/ttyS1 billionton

Agora eu compus dois scripts

# cat bt-mouse-suspend.service 
[Unit]
Description=BT Mouse suspend helper
Before=sleep.target

[Service]
Type=simple
ExecStart=-/usr/bin/pkill hciattach

[Install]
WantedBy=sleep.target
# cat bt-mouse-resume.service 
[Unit]
Description=BT Mouse resume helper
After=suspend.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/hciattach -s 152000 /dev/ttyS1 billionton

[Install]
WantedBy=suspend.target
# systemctl status bt-mouse-resume
● bt-mouse-resume.service - BT Mouse resume helper
   Loaded: loaded (/etc/systemd/system/bt-mouse-resume.service; enabled; vendor preset: disabled)
   Active: active (exited) since Mon 2017-04-03 22:09:50 EEST; 12min ago
 Main PID: 6386 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/bt-mouse-resume.service

apr   03 22:09:50 Twinh systemd[1]: Started BT Mouse resume helper.
apr   03 22:09:51 Twinh hciattach[6386]: Device setup complete
# pgrep hciattach
#

O script suspenso funciona bem e mata o que é esperado. Mas o currículo hciattach uma vez executado, mas desapareceu depois disso.

    
por Herman 02.04.2017 / 22:36

1 resposta

1

Você confundiu a que After está se referindo, After fará com que um serviço espere por outra unidade antes de iniciar. Seu Wanted-By=suspend.target e After=suspend.target se contradizem.

O Wanted-By está declarando que bt-mouse-resume.service é uma parte de suspend.target , mas o After está afirmando que bt-mouse-resume.service deve aguardar até que suspend.target seja concluído. Os serviços não devem fazer parte de um alvo e esperar pelo alvo antes de começar. Isso também significa que você está configurando seu serviço para ser executado quando suspend.target for iniciado, e não quando for concluído.

O que você realmente está procurando é uma maneira de executar algo ao parar suspend.target , então, vou mostrar uma parte muito importante de systemd :

Note that when two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied.

Referência

Então você diz que seu bt-mouse-suspend.service está funcionando corretamente. Por causa de seu Wanted-By=sleep.target , quando sleep.target é iniciado, seu serviço é executado. Por outro lado, quando sleep.target for interrompido, bt-mouse-suspend.service também será interrompido. Você não deve exigir o campo Before neste serviço, você já está fazendo do seu serviço uma ação desse alvo.

Portanto, se você quiser executar /usr/bin/hciattach -s 152000 /dev/ttyS1 billionton ao sair de sleep.target , crie ExecStop para bt-mouse-suspend.service .

Também recomendo mais algumas leituras sobre como o systemd funciona, ou seja, dê uma olhada em:

link

link

link

Além disso, seus dois serviços segmentam suspend.target e sleep.target . Obviamente, você deve usar o alvo que realmente estiver interessado, mas provavelmente está procurando apenas suspend.target .

    
por 03.04.2017 / 22:57