Systemd de usuario
El gestor systemd permite configurar servicios desde un usuario normal del sistema. Estos servicios de usuario de systemd son una funcionalidad poco conocida pero muy útil. Consiste en poder crear y usar ficheros .service
desde un directorio local del usuario y que se ejecuten con sus privilegios.
systemd es un gestor de sistemas y servicios para Linux que se ejecuta como PID 1 y arranca todo el sistema. Permite paralelización, usa sockets y D-Bus para iniciar los servicios, inicia demonios, monitoriza y gestiona procesos, puntos de montaje. Desplazó a sysvinit
como estándar de facto hace ya tiempo.
Tiene una funcionalidad muy interesante llamada “user lingering” que consiste en ejecutar instancias de systemd como usuario normal del sistema. Eso nos va a permitir lanzar procesos de usuario durante el arranque del sistema.
Configuración
Veamos un ejemplo. Tengo una maquina virtual para desarrollo de software preparada con Vagrant que quiero arrancar durante el boot de un equipo Linux llamado jupiter
como usuario normal luis
.
- Conecto como
luis
luis @ idefix ➜ ~ ssh -Y -a luis@jupiter.tudominio.com
luis@jupiter:~$
- Le doy permiso a
luis
(desderoot
) para habilitar esta función de lingering
luis@jupiter:~$ sudo loginctl enable-linger luis
luis@jupiter:~$
- Me preparo mi fichero:
~/.config/systemd/user/devbox.service
:
[Unit]
AssertPathExists=/home/luis/devbox
[Service]
WorkingDirectory=/home/luis/devbox
ExecStart=/usr/bin/vagrant up
Restart=always
PrivateTmp=true
NoNewPrivileges=true
[Install]
WantedBy=default.target
- Habilito, arranco, consulto el servicio
devbox.service
luis@jupiter:~$ systemctl --user enable devbox.service
Created symlink /home/luis/.config/systemd/user/default.target.wants/devbox.service → /home/luis/.config/systemd/user/devbox.service.
luis@jupiter:~$ systemctl --user start devbox
luis@jupiter:~$ systemctl --user status devbox
● devbox.service
Loaded: loaded (/home/luis/.config/systemd/user/devbox.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-05-30 13:52:41 CEST; 37s ago
Main PID: 4541 (vagrant)
Tasks: 4 (limit: 18983)
Memory: 71.2M
CPU: 2.990s
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/devbox.service
└─4541 /usr/bin/ruby /usr/bin/vagrant up
:
- A partir de ahora, cada vez que se rearranque el gestor
systemd
ejecutará el comandovagrant up
(como usuarioluis
) durante el boot.
Nota: En mi caso reicibí el error Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined . Estaba conectando vía ssh y el servidor tenía la opción UsePAM no . La cambié a UsePAM yes , rearranqué el servidor sshd y volví a conectar |