Unité utilisateur Systemd qui dépend de l'unité système (sleep.target)

16

Je lisais un document et je ne sais toujours pas si ce qui suit est possible:

service défini en ~/.config/systemd/user/task.servicefonction de system sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Maintenant, je m'attends task.serviceà commencer quand je cours $ systemctl suspend, mais task.servicen'est pas démarré.

J'utilise debian, avec la version systemd 208, systemd --userconfigurée plus ou moins comme décrit sur l' ArchWiki .

Je me demande si mon scénario pourrait être mis en œuvre avec systemd du tout, ou sont --systemet --usercomplètement isolé par la conception de sorte que l' --userunité ne peut pas être une dépendance d'une --systemunité.

Si c'est possible, quel pourrait être le problème dans mon cas?

Alexander Kitaev
la source
Problème

Réponses:

8

De systemd / User - Archwiki

systemd --users'exécute en tant que processus distinct du systemd --systemprocessus. Les unités utilisateur ne peuvent pas référencer ou dépendre des unités système.

sshow
la source
4
Ça craint. C'est dommage.
Rolf
5

systemdles services de session utilisateur s'exécutent dans une instance complètement distincte de systemd, et n'ont aucun moyen de dépendre directement des services système.

Il existe cependant d'autres façons d'accomplir ce que vous voulez. Le plus propre serait probablement de faire tout ce que vous voulez exécuter lorsque le système va s'accrochez aux logindinhibiteurs de, puis de l'exécuter en tant que démon d'arrière-plan.

Une solution plus générale serait d'avoir un démon connecté aux logindinhibiteurs, (voir systemd-lock-handler et xss-lock ,) puis lorsque le système va se mettre en veille, il activera une cible de session utilisateur que vous pouvez commander vos services en dessous de.

kyrias
la source
2

Pour ajouter à la réponse de @kyrias, voici un moyen de créer votre propre sleep.target au niveau utilisateur:

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

Voir mon article de blog https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

aiguofer
la source