Systemd Benutzereinheit, die von der Systemeinheit abhängt (sleep.target)

16

Ich habe doc gelesen und es ist mir immer noch unklar, ob das Folgende möglich ist:

Der darin definierte Dienst ~/.config/systemd/user/task.servicehängt von system sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service) ab.

Jetzt erwarte ich task.servicezu starten, wenn ich laufe $ systemctl suspend, wird jedoch task.servicenicht gestartet.

Ich führe Debian mit Systemd-Version 208 aus, die systemd --usermehr oder weniger wie im ArchWiki beschrieben konfiguriert ist .

Ich frage mich , ob mein Szenario mit systemd überhaupt umgesetzt werden könnte, oder ist --systemund --uservollständig getrennt von Design , so dass --userEinheit nicht eine Abhängigkeit von einem sein kann --systemEinheit.

Falls es möglich ist, was könnte das Problem in meinem Fall sein?

Alexander Kitaev
quelle

Antworten:

8

Aus systemd / User - Archwiki

systemd --userläuft als separater Prozess vom systemd --systemProzess ab. Benutzereinheiten können nicht auf Systemeinheiten verweisen oder von diesen abhängen.

sshow
quelle
4
Das ist scheiße. Das ist sehr schade.
Rolf
5

systemdBenutzersitzungsdienste werden in einer vollständig separaten Instanz von ausgeführt systemdund können nicht direkt von Systemdiensten abhängen.

Es gibt aber auch andere Möglichkeiten, das zu erreichen, was Sie wollen. Am saubersten ist es wahrscheinlich, wenn Sie festlegen, was Sie ausführen möchten, wenn das System in den Ruhezustand versetzt wird logind, und es dann als Hintergrunddämon ausführen.

Eine allgemeinere Lösung wäre, einen Daemon - Hook in die logindInhibitoren einzubinden (siehe systemd-lock-handler und xss-lock ) und dann, wenn das System in den Ruhezustand geht, ein Benutzersitzungsziel zu aktivieren, das Sie bestellen können unter.

kyrias
quelle
2

Neben der Antwort von @kyrias können Sie hier Ihr eigenes sleep.target auf Benutzerebene erstellen:

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

Siehe meinen Blog-Beitrag https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

Aiguofer
quelle