Системный пользовательский блок, который зависит от системного блока (sleep.target)

16

Я читал документ, и мне до сих пор неясно, возможно ли выполнить следующее:

сервис, определенный в ~/.config/systemd/user/task.serviceэтом, зависит от system sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Теперь я ожидаю, task.serviceчтобы начать, когда я бегу $ systemctl suspend, однако task.serviceне запускается.

Я использую debian с версией systemd 208, systemd --userнастроенной более или менее так, как описано в ArchWiki .

Интересно , может ли мой сценарий будет реализован с Systemd на всех, или --systemи --userполностью изолирован от дизайна , так что --userустройство не может быть зависимостью из --systemединицы.

Если это возможно, в чем может быть проблема в моем случае?

Александр Китаев
источник

Ответы:

8

От systemd / Пользователь - Archwiki

systemd --userработает как отдельный процесс от systemd --systemпроцесса. Пользовательские блоки не могут ссылаться или зависеть от системных блоков.

sshow
источник
4
Это отстой. Это очень плохо.
Рольф
5

systemdпользовательские сервисы сеансов работают в совершенно отдельном экземпляре systemdи не имеют никакой возможности напрямую зависеть от системных сервисов.

Есть и другие способы достичь желаемого. Самое чистое, вероятно, было бы сделать все, что вы хотите запустить, когда система спит, подключить logindингибиторы, а затем запустить его в качестве фонового демона.

Более общим решением было бы установить демоны на logindингибиторы (см. Systemd-lock-handler и xss-lock ), а затем, когда система перейдет в спящий режим, она активирует цель сеанса пользователя, которую вы можете заказать для своих сервисов. под.

kyrias
источник
2

В дополнение к ответу @kyrias, вот способ создать свой собственный уровень пользователя sleep.target:

~ / .Local / доля / Systemd / пользователь / sleep.target

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

~ / .Local / бен / 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 / доля / Systemd / пользователь / 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

Смотрите мой пост в блоге https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

aiguofer
источник