Unità utente di sistema che dipende dall'unità di sistema (sleep.target)


16

Stavo leggendo doc ed è ancora poco chiaro per me se è possibile realizzare quanto segue:

il servizio definito ~/.config/systemd/user/task.servicedipende dal sistema sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Ora mi aspetto task.servicedi iniziare quando corro $ systemctl suspend, tuttavia task.servicenon è avviato.

Sto eseguendo debian, con systemd versione 208, systemd --userconfigurato più o meno come descritto su ArchWiki .

Mi chiedo se il mio scenario possa essere implementato con systemd, o se --systemsia --usercompletamente isolato dalla progettazione in modo che l' --userunità possa non essere una dipendenza di --systemun'unità.

Nel caso sia possibile, quale potrebbe essere il problema nel mio caso?


Risposte:


8

Da systemd / User - Archwiki

systemd --userviene eseguito come processo separato dal systemd --systemprocesso. Le unità utente non possono fare riferimento o dipendere dalle unità di sistema.


4
Questo fa schifo. È troppo male.
Rolf

5

systemdi servizi di sessione utente vengono eseguiti in un'istanza completamente separata di systemde non hanno alcun modo di dipendere direttamente dai servizi di sistema.

Ci sono altri modi per ottenere ciò che vuoi però. Probabilmente il più pulito sarebbe quello di rendere qualsiasi cosa tu voglia eseguire quando il sistema dormirà agganciato agli logindinibitori e quindi eseguirlo come un demone in background.

Una soluzione più generale sarebbe quella di avere un demone agganciato agli logindinibitori, (vedi systemd-lock-handler e xss-lock ,) e quindi quando il sistema andrà in stop attiverà un target di sessione utente che puoi ordinare i tuoi servizi sotto.


2

Aggiungendo alla risposta di @kyrias, ecco un modo per creare il tuo livello utente sleep.target:

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

Vedi il mio post sul blog https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.