Систематизований блок користувача, який залежить від системного блоку (sleep.target)


16

Я читав doc, і мені досі незрозуміло, чи можна виконати наступне:

сервіс, визначений у ~/.config/systemd/user/task.serviceцьому, залежить від системи sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Зараз я розраховую task.serviceпочати, коли я бігаю $ systemctl suspend, однак task.serviceне запускається.

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

Цікаво, чи мій сценарій взагалі може бути реалізований із системою, або повністю --systemі --userпоодиноко розроблений дизайном, щоб --userодиниця не була залежністю --systemодиниці.

У разі, якщо це можливо, яка проблема може бути в моєму випадку?


Відповіді:


8

Від systemd / Користувач - Archwiki

systemd --userзапускається як окремий процес від systemd --systemпроцесу. Користувацькі блоки не можуть посилатися або залежати від системних блоків.


4
Це смокче. Це дуже погано.
Рольф

5

systemdпослуги сеансу користувача запускаються в абсолютно окремому екземплярі systemdі не мають ніякого способу безпосередньо залежати від системних служб.

Є й інші способи досягти того, що ти хочеш. Найчистішим було б, мабуть, зробити все, що ви хочете запустити, коли система буде спати на logindгальмуючі інгібітори, а потім запустити його як фоновий демон.

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


2

Додавши відповідь від @kyrias, ось спосіб створення власного сну на рівні користувача.

~ / .local / share / systemd / користувач / 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

Дивіться мій пост у блозі https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.