Unidad de usuario de Systemd que depende de la unidad del sistema (sleep.target)

16

Estaba leyendo un documento y todavía no me queda claro si es posible lograr lo siguiente:

servicio definido en ~/.config/systemd/user/task.serviceeso depende del sistema sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Ahora espero task.servicecomenzar cuando corro $ systemctl suspend, sin embargo, no task.servicese inicia.

Estoy ejecutando debian, con la versión 208 de systemd, systemd --userconfigurada más o menos como se describe en ArchWiki .

Me pregunto si mi escenario podría ser implementado con systemd en absoluto, o son --systemy --usercompletamente aislado por el diseño de manera que --userla unidad puede no ser una dependencia de una --systemunidad.

En caso de que sea posible, ¿cuál podría ser el problema en mi caso?

Alexander Kitaev
fuente
Problema

Respuestas:

8

De systemd / User - Archwiki

systemd --userse ejecuta como un proceso separado del systemd --systemproceso. Las unidades de usuario no pueden hacer referencia o depender de las unidades del sistema.

sshow
fuente
44
Esto apesta. Eso es muy malo.
Rolf
5

systemdlos servicios de sesión de usuario se ejecutan en una instancia completamente separada de systemd, y no tienen ninguna forma de depender directamente de los servicios del sistema.

Sin embargo, hay otras formas de lograr lo que quieres. Lo más limpio probablemente sería hacer que lo que quiera ejecutar cuando el sistema vaya a dormir se enganche en logindlos inhibidores y luego ejecutarlo como un demonio de fondo.

Una solución más general sería tener un demonio conectado a los logindinhibidores (ver systemd-lock-handler y xss-lock ) y luego, cuando el sistema se vaya a dormir, activará un objetivo de sesión de usuario que puede solicitar sus servicios. debajo.

kyrias
fuente
2

Agregando a la respuesta de @kyrias, aquí hay una manera de crear su propio nivel de usuario 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

Vea la publicación de mi blog https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

aiguofer
fuente