¿Cómo ejecutar un script de usuario después de la activación de systemd?

10

Cuando mi caja de escritorio Debian Jessica se despierta de la suspensión (a través del nuevo y brillante systemd), la configuración de mi mouse vuelve a sus valores predeterminados, después de restablecer mi personalización

xinput set-prop 12 'Device Accel Constant Deceleration' 2.5

que se ejecuta cuando inicio sesión.

¿Cómo puedo ejecutar un script de usuario arbitrario al despertar? (suponga que el usuario es el propietario de la sesión X)

Hasta donde puedo recordar, la siguiente es la única personalización que hice de la systemdconfiguración (sí, sé que está completamente mal porque no funciona para usuarios arbitrarios, pero aún no he descubierto cómo hacerlo) ... esto está algo relacionado)

además, ¿cómo puedo ejecutar una secuencia de comandos de usuario arbitraria antes de despertar, como el usuario que actualmente usa la pantalla X?

cat /etc/systemd/system/i3lock.service

#systemctl enable i3lock.service

[Unit]
Description=i3lock
Before=sleep.target

[Service]
User=fommil
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock -c 000000

[Install]
WantedBy=sleep.target
fommil
fuente
askubuntu.com/a/661747 Me ayuda en mi caso, que es diferente al tuyo. Quizás te pueda ser útil.
Sun Bear

Respuestas:

5

Esta respuesta se basa en askubuntu.com/a/661747/394818 (como también se hace referencia en el comentario por @ sol-oso), askubuntu.com/q/616272/394818 y superuser.com/a/1269158/585953 .

Usando un servicio del sistema:

Crea el archivo /etc/systemd/system/my_user_script.service:

[Unit]
Description=Run my_user_script
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target


[Service]
ExecStart=/path/to/my_user_script
#User=my_user_name
#Environment=DISPLAY=:0

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

Elimine suspender / hibernar / híbrido en caso de que el servicio solo se ejecute después de despertarse de un tipo específico de suspensión. En caso de que el servicio necesita ser ejecutado por un usuario específico, quite el comentario User=y Environment=líneas y reemplazar el nombre de usuario correspondiente.

Instale el archivo de servicio con:

sudo systemctl enable my_user_script

Usar un servicio de usuario no funcionará:

Para evitar establecer un nombre de usuario codificado con User=, se podría crear exactamente el mismo archivo de servicio en .local/share/systemd/user/my_user_script.servicey activar con

systemctl --user enable my_user_script

Sin embargo, eso no funcionará. @grawity explica con más detalle en unix.stackexchange.com/a/174837/163108 por qué eso es:

sleep.targetEs específico de los servicios del sistema. La razón es sleep.targetque no es un objetivo mágico que se activa automáticamente cuando se va a dormir. Es solo un objetivo regular que pone el sistema en suspensión, por lo que las instancias de 'usuario', por supuesto, no tendrán un equivalente. (Y desafortunadamente, las instancias de 'usuario' actualmente no tienen forma de depender de los servicios de todo el sistema).

davidovitch
fuente
3

Creé un archivo en / lib / systemd / system-sleep .

#!/bin/sh
case $1 in
  post)
    /bin/runme
  ;;
esac

La publicación se llama al despertar.

EDITAR:

https://www.freedesktop.org/software/systemd/man/systemd-suspend.service.html

gam3
fuente
1
Esto no funcionó para mí. ¿Puedes vincular a alguna documentación que explique cómo se supone que funciona?
Ryan Lue
Esto tampoco funciona para mí. El contexto en el que se ejecuta este script es extremadamente limitado y no se ejecuta como el usuario que estaba activo cuando el sistema se fue a dormir. Por lo tanto, no tiene acceso a la pantalla (que excluye la mayoría de las utilidades de escritorio aquí), información / variables para el usuario que ha iniciado sesión o cualquier otra cosa relacionada con la sesión del usuario que está actualmente conectado. Necesito un script para ejecutar como El usuario que ha iniciado sesión dentro del contexto de la sesión de escritorio. Todavía no he encontrado nada para hacer esto, pero actualizaré aquí si lo hago.
theferrit32
@ theferrit32 debería poder cambiar a su usuario preferido con el comando 'su' desde su script.
borizzzzz
1

Abre este archivo:

sudo vim / lib / systemd / system-sleep / hdparm

Contenido:

#! / bin / sh

caso $ 1 en publicación)
    /usr/lib/pm-utils/power.d/95hdparm-apm resume
    ## Pegue su comando para ejecutar su script
    ;; esac

Su comando se ejecutará con privilegios de administrador .

Abhishek Singh
fuente