Cómo iniciar un servicio systemd después del inicio de sesión del usuario y detenerlo antes de que el usuario cierre sesión

10

Tengo una máquina Fedora 23.

Tengo un guión bash de sincronización de directorio / archivo que sincroniza mi directorio local / de inicio con un directorio remoto (en una máquina NAS). Lo ejecuto manualmente pero me gustaría crear un servicio systemd y hacerlo más flexible, ya que otras personas usan mi PC con sus propias credenciales de usuario, me gustaría saber cuándo un usuario está conectado e iniciar mi servicio después.

¿Hay algo que pueda hacer desde el archivo systemd de mi servicio o tendré que verificarlo desde mi código en el script?

Solo necesito asegurarme de tener acceso a las variables de entorno (como $ USER) y ejecutarlo como un servicio.

Mi principal fuente de documentación es este enlace https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

GeorgeKaf
fuente
¿ systemctl --userFunciona en F23?
user1686
Supongo que sí, devuelve una lista y un mensaje 76 loaded units listed.
GeorgeKaf
Aquí hay otro enfoque que podría funcionar para usted: unix.stackexchange.com/a/109270/111707 Escriba un pequeño script Python que inicie desde .bashrcel inicio de sesión, luego escucha la señal de cierre de sesión de Gnome y se apaga.
IanB
@IanB Gracias, lo probaré. Nunca está de más tener algo así alrededor.
GeorgeKaf

Respuestas:

15

Utilice systemd , ya incluye soporte para sesiones de usuario, de hecho, ya debería depender de él (sin darse cuenta).

Crea el directorio de servicios

mkdir -p $HOME/.local/share/systemd/user

Crear, editar un archivo de servicio (vim, gedit, geany, lo que quieras)

vim $HOME/.local/share/systemd/user/my.service

Debería verse más o menos así, si se trata de un servicio permanente.

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

Pero parece que prefieres activarlo una vez, luego ser bueno con él, así que mejor usa una configuración de un disparo como esta:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

Por supuesto, esto supone que su script es ejecutable, es decir:

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

De lo contrario, deberá anteponer la ruta al intérprete respectivo:

ExecStart=/bin/bash /path/to/start/script arguments

Ahora vuelva a cargar systemd (y vuelva a iniciar sesión para probar)

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

Si necesita más información, consulte Arch-Wiki, por ejemplo. Este hilo de askubuntu tiene varias ideas, incluida la mía.

Puede extender el comportamiento (si es root) a otros usuarios definiendo el servicio globalmente. Para hacer esto, necesitaría crear el archivo de servicio en / usr / share / systemd / user / not en $ HOME / .local / share / systemd / user .

ansioso
fuente
1
Hola, la respuesta fue buena. Pero solo funcionará si el servicio debe iniciarse en el primer inicio de sesión y detenerse en la última sesión del usuario.
Anwar
44
Necesita el indicador --user al habilitar el servicio. "systemctl --user enable my.service"
blushrt
0

Sé esto hace algunos años, pero la respuesta de ans simplemente me ayudó. Entonces, supongo que todavía es relevante. Además, esto es más un comentario, pero no tengo ese privilegio, así que lo publico como una "respuesta". De todos modos...

Al ejecutar Linux Mint 19, no pude "habilitar" el servicio cuando el script estaba ubicado en '$ HOME / .local / share / systemd / user'. Intentar hacerlo siempre resultó en un error. Sin embargo, podría iniciarlo bien desde el directorio '$ HOME / .local / share / systemd / user'. Después de mover el script a '/ usr / share / systemd / user /', systemd me permitió habilitarlo sin problemas.

notorio dds
fuente