Systemowa jednostka użytkownika, która zależy od jednostki systemowej (sleep.target)

16

Czytałem doc i nadal nie jest dla mnie jasne, czy można osiągnąć następujące cele:

zdefiniowana usługa ~/.config/systemd/user/task.servicezależy od system sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Teraz spodziewam task.servicesię rozpocząć po uruchomieniu $ systemctl suspend, jednak task.servicenie zostało uruchomione.

Używam debiana z wersją systemową 208, systemd --userskonfigurowaną mniej więcej tak, jak opisano na ArchWiki .

Zastanawiam się, czy mój scenariusz mógłby zostać w ogóle zaimplementowany w systemie, czy też jest --systemi jest --usercałkowicie odizolowany od projektu, aby --userjednostka nie była zależna od --systemjednostki.

Jeśli jest to możliwe, jaki może być problem w moim przypadku?

Alexander Kitaev
źródło

Odpowiedzi:

8

Od systemd / User - Archwiki

systemd --userdziała jako proces odrębny od systemd --systemprocesu. Jednostki użytkownika nie mogą odwoływać się ani zależeć od jednostek systemowych.

sshow
źródło
4
To jest do bani. Szkoda.
Rolf
5

systemdusługi sesji użytkownika działają w całkowicie osobnej instancji systemdi nie mogą w żaden sposób zależeć bezpośrednio od usług systemowych.

Istnieją jednak inne sposoby osiągnięcia tego, co chcesz. Najczystszym rozwiązaniem byłoby prawdopodobnie zrobienie czegokolwiek, co chcesz uruchomić, gdy system zamierza uśpić haczyka do logindinhibitorów, a następnie uruchomić go jako demona w tle.

Bardziej ogólnym rozwiązaniem byłoby podłączenie demona do logindinhibitorów (patrz systemd-lock-handler i xss-lock ), a następnie, gdy system przejdzie w stan uśpienia, aktywuje cel sesji użytkownika, w którym możesz zamówić swoje usługi pod.

Kyrias
źródło
2

Dodając do odpowiedzi @kyrias, oto sposób na utworzenie własnego sleep.target na poziomie użytkownika:

~ / .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

Zobacz mój post na blogu https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

aiguofer
źródło