Quiero configurar un docked.target
sistema en mi nivel de usuario. La idea es ejecutar algunos servicios para configurar mis pantallas externas.
Actualmente tengo esta como regla:
SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="docked.target"
La regla se detecta muy bien (puedo ver dev-tp_mini_dock.device
cuando estoy acoplado).
Luego tengo esto ~/.config/systemd/user/docked.target
(también lo intenté /etc/systemd/user
sin suerte):
[Unit]
Description=Docked to ThinkPad Mini Dock
BindTo=dev-tp_mini_dock.device
Pero esto no comienza cuando atraco. Sin embargo, si inicio manualmente docked.target
mientras estoy acoplado, se detiene como se esperaba cuando lo desacople.
Sin embargo, si uso ENV{SYSTEMD_WANTS}="docked.target"
y coloco el archivo en /etc/systemd/system/docked.target
, el objetivo comienza como se esperaba cuando lo conecto. El problema entonces es que mi instancia de nivel de usuario no conoce los servicios/objetivos a nivel de sistema.
¿Alguna idea? He visto algunas otras preguntas en la red y una casi exactamente como la mía:https://bbs.archlinux.org/viewtopic.php?pid=1600019
Respuesta1
Aunque todavía no sé cómo ENV{SYSTEMD_USER_WANTS}
funciona, logré resolver mi problema específico después de leereste blog.
Resulta que puedo instalar objetivos como una dependencia de los dispositivos. Cambié mi archivo de unidad ~/.config/systemd/user/docked.target
a:
[Unit]
Description=Docked to ThinkPad Mini Dock
BindsTo=dev-tp_mini_dock.device
After=dev-tp_mini_dock.device
[Install]
WantedBy=dev-tp_mini_dock.device
y mi regla udev es:
SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR}=="17ef", ENV{ID_MODEL}=="100a", SYMLINK+="tp_mini_dock", TAG+="systemd"
y luego habilítelo con systemctl --user enable docked.target
.
Ahora, cuando lo conecto, la regla udev crea el dispositivo systemd, que a su vez inicia el objetivo. Luego, la BindsTo
opción se asegura de que cuando el dispositivo desaparezca (se desconecte) el objetivo se detenga.
Tuve que hacer algo de magia sin sentido para que esto funcionara cuando inicio sesión con la base ya conectada. Uno podría imaginar que simplemente agregar default.target
y WantedBy
sería After
suficiente... Agregaré un enlace a un blog después de escribirlo.
Respuesta2
Puedes intentar reemplazar SYSTEMD_USER_WANTS
con MANAGER_USER_WANTS
. No estoy 100% seguro de este cambio de nombre, pero al menos ya systemd-226
no se menciona SYSTEMD_USER_WANTS
en las fuentes y parece ser reemplazado por MANAGER_USER_WANTS
. Al menos a mí me funcionó para un caso similar.
Respuesta3
Hombre... Ese problema también me enfermó, ¡qué bicho!
En mi caso, quería escuchar eventos HDMI (monitorización en caliente) y encontré un truco para solucionar este problema. Pensé, bueno, si esto udev
de alguna manera sabe que inició un servicio con tal o cual nombre y se niega a hacerlo nuevamente, entonces hagamos que crea que inicia un nuevo servicio cada vez. Todos los ojos puestos en el udev
evento correspondiente:
UDEV [19214.534185] change /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0 (drm)
ACTION=change
DEVLINKS=/dev/dri/by-path/pci-0000:01:00.0-card
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=0
SEQNUM=3364
SUBSYSTEM=drm
USEC_INITIALIZED=3280572
y observe el SEQNUM
. Está cambiando en cada nuevo evento y eso es exactamente lo que queremos:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", ENV{SYSTEMD_USER_WANTS}+="monitor-hotplug@$env{SEQNUM}.service", TAG+="systemd"
Funciona de maravilla incluso para . Ojalá tus eventos también tengan algo similar.~/.config/systemd/user/[email protected]
SEQNUM