Unidade de usuário Systemd que depende da unidade do sistema (sleep.target)

16

Eu estava lendo o documento e ainda não está claro para mim se é possível realizar o seguinte:

serviço definido em ~/.config/systemd/user/task.serviceque depende do sistema sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Agora, espero task.servicecomeçar quando corro $ systemctl suspend, mas task.servicenão foi iniciado.

Estou executando o debian, com a versão 208 do systemd, systemd --userconfigurada mais ou menos como descrito no ArchWiki .

Pergunto-me se o meu cenário poderia ser implementado com systemd em tudo, ou são --systeme --usercompletamente isolado por projeto de modo que --userunidade pode não ser uma dependência de uma --systemunidade.

Caso seja possível, qual pode ser o problema no meu caso?

Alexander Kitaev
fonte
Problema semelhante
l0b0 12/08

Respostas:

8

De systemd / Usuário - Archwiki

systemd --useré executado como um processo separado do systemd --systemprocesso. As unidades do usuário não podem fazer referência ou depender das unidades do sistema.

sshow
fonte
4
Isso é péssimo. Isso é ruim.
Rolf
5

systemdos serviços de sessão do usuário são executados em uma instância completamente separada systemde não têm como depender diretamente dos serviços do sistema.

Existem outras maneiras de realizar o que você deseja. O mais limpo seria provavelmente fazer com que o que você deseja executar quando o sistema estiver ligado aos logindinibidores e, em seguida, execute-o como um daemon em segundo plano.

Uma solução mais geral seria ter um daemon conectado aos logindinibidores (consulte systemd-lock-handler e xss-lock ) e, quando o sistema estiver inativo, ele ativará um destino de sessão do usuário que você poderá solicitar seus serviços debaixo.

kyrias
fonte
2

Além da resposta de @kyrias, aqui está uma maneira de criar seu próprio sono.target no nível do usuário:

~ / .local / share / systemd / user / sleep.target

[Unit]
Description=User level sleep target
StopWhenUnneeded=yes

~ / .local / bin / watch_sleep

#!/bin/bash

dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Manager',member=PrepareForSleep" | while read x; do
    case "$x" in
        *"boolean false"*) systemctl --user --no-block stop sleep.target;;
        *"boolean true"*) systemctl --user --no-block start sleep.target;;
    esac
done

~ / .local / share / systemd / user / watch_sleep.service

[Unit]
Description=watch for sleep signal to start sleep.target

[Service]
ExecStart=%h/.local/bin/watch_sleep
Restart=on-failure

[Install]
WantedBy=default.target

Veja minha postagem no blog https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

aiguofer
fonte