Administración de servicios y demonios (RSA-07)
En este apartado te enseño a gestionar los servicios que operan en segundo plano en tu sistema, también conocidos como "demonios" (daemons).
Aprenderás a iniciarlos, detenerlos, reiniciarlos, ver sus registros y controlar cómo se comportan al arrancar el sistema.
Comando: systemctl
Sintaxis Básica
Gestión de servicios en sistemas con systemd.
Ejemplos:
# systemctl start nginx
# systemctl stop apache2
# systemctl status ssh
Sintaxis Avanzada
Permite reiniciar servicios, activarlos al inicio del sistema y listar servicios activos.
Ejemplos:
# systemctl restart mysql
# systemctl enable docker
# systemctl list-units --type=service --state=active
# systemctl is-enabled cron
Comando: service
Sintaxis Básica
Interfaz clásica para servicios en sistemas SysVinit o con compatibilidad heredada.
Ejemplos:
# service cron start
# service ssh stop
# service apache2 status
Sintaxis Avanzada
Puede usarse en scripts o entornos híbridos.
Ejemplos:
# service --status-all
# service mysql restart
Comando: /etc/init.d
Sintaxis Básica
Control directo sobre scripts de arranque clásicos.
Ejemplos:
# /etc/init.d/nginx start
# /etc/init.d/ssh restart
Sintaxis Avanzada
Usado para personalizar o depurar servicios manualmente.
Ejemplos:
# update-rc.d apache2 defaults
# /etc/init.d/mysql stop && /etc/init.d/mysql start
Comando: rc-service (OpenRC)
Sintaxis Básica
Gestión de servicios en distribuciones con OpenRC.
Ejemplos:
# rc-service sshd start
# rc-service nginx stop
# rc-service cron status
Sintaxis Avanzada
Permite configurar servicios en perfiles o habilitar al arranque.
Ejemplos:
# rc-update add sshd default
# rc-service --list
Gestión de sockets con systemd
Los sockets son interfaces de red o archivos especiales que activan servicios bajo demanda.
Ejemplos:
# systemctl list-units --type=socket
# systemctl status dbus.socket
# systemctl start cups.socket
Sintaxis Avanzada:
# systemctl enable ssh.socket
# systemctl is-active systemd-journald.socket
Visualización de logs con journalctl
Los servicios en systemd guardan registros en el "journal".
Sintaxis Básica
$ journalctl -u nginx
$ journalctl -xe
Sintaxis Avanzada
$ journalctl -u apache2 --since "1 hour ago"
$ journalctl -u mysql.service -f # Modo seguimiento (tail)
$ journalctl --priority=3 --boot # Solo errores graves desde el último arranque
Ver unidades en fallo
Puedes consultar qué servicios han fallado en el sistema.
Ejemplos:
# systemctl --failed
# systemctl status nombre.service
# journalctl -xe
Servicios por usuario (systemctl --user
)
Algunos servicios funcionan solo dentro del entorno de usuario actual, sin privilegios de root.
Uso básico
$ systemctl --user start pipewire
$ systemctl --user status tracker-miner-fs
Uso avanzado
$ systemctl --user enable syncthing
$ systemctl --user restart dconf
$ systemctl --user list-units --type=service
Nota: En algunos entornos, para que systemctl --user
funcione correctamente, debe haberse iniciado previamente el user@UID.service
mediante loginctl enable-linger usuario
.
Crear y personalizar unidades de servicio por usuario
En sistemas que usan systemd
, puedes definir tus propios servicios como usuario en el directorio ~/.config/systemd/user/
. Esto permite lanzar procesos automáticamente al iniciar sesión o controlarlos manualmente sin requerir sudo
.
Estructura básica de una unidad
Crea un archivo con extensión .service
, por ejemplo:
$ nano ~/.config/systemd/user/mi_servicio.service
Contenido de ejemplo:
[Unit]
Description=Mi servicio personalizado por usuario
[Service]
ExecStart=/home/luisgulo/scripts/mi_app.sh
Restart=on-failure
[Install]
WantedBy=default.target
ExecStart
: ruta al script o ejecutable que deseas lanzar.Restart
: reinicio automático si falla.WantedBy
: define el target que inicia el servicio (comodefault.target
en sesiones de usuario).
Activar el servicio
Después de crear el archivo:
$ systemctl --user daemon-reexec
$ systemctl --user daemon-reload
$ systemctl --user enable mi_servicio.service
$ systemctl --user start mi_servicio.service
Verificar el estado
$ systemctl --user status mi_servicio
Mostrar logs del servicio
$ journalctl --user-unit=mi_servicio.service -f
Notas importantes
- Los servicios de usuario requieren una sesión activa.
- Todos los servicios deben estar en
~/.config/systemd/user/
con permisos adecuados.
Para que funcionen sin sesión gráfica, puedes habilitar linger con:
# loginctl enable-linger luisgulo
Un ejemplo de script de sincronización en Bash, pensado para ejecutarse como servicio de usuario con systemctl --user
, copia algunas carpetas personales a una ubicación de backup.
Es sencillo de entender, reutilizable y se puede integrar fácilmente con unidades personalizadas.
#!/bin/bash
# Archivo: sincroniza_personales.sh
# Descripción: Sincroniza carpetas clave del usuario con una ubicación de respaldo local
# Carpeta de destino
DESTINO="$HOME/Respaldo"
# Lista de carpetas a sincronizar
CARPETAS=(
"$HOME/Documentos"
"$HOME/Imágenes"
"$HOME/Proyectos"
)
# Opciones para rsync
OPCIONES="-a --delete --exclude='*.tmp'"
# Comenzar sincronización
echo "Inicio: $(date)"
for carpeta in "${CARPETAS[@]}"; do
nombre=$(basename "$carpeta")
rsync $OPCIONES "$carpeta/" "$DESTINO/$nombre/"
done
echo "Fin: $(date)"
Detalles útiles
-a
en rsync asegura que se copien permisos, timestamps y estructura de carpetas.--delete
mantiene la copia actualizada eliminando archivos que ya no existen en origen.--exclude='*.tmp'
evita respaldar archivos temporales.- Puedes añadir exclusiones más finas o rutas remotas si en un futuro quieres extenderlo.
Ejecución como servicio de usuario
Una vez tengas el script guardado en, por ejemplo, ~/scripts/sincroniza_personales.sh
, lo puedes integrar como servicio mediante un archivo ~/.config/systemd/user/sinc-respaldo.service
como este:
[Unit]
Description=Servicio de sincronización de carpetas personales
[Service]
ExecStart=%h/scripts/sincroniza_personales.sh
Type=simple
[Install]
WantedBy=default.target
Este servicio se puede habilitar, iniciar o monitorear con:
$ systemctl --user daemon-reload
$ systemctl --user enable sinc-respaldo.service
$ systemctl --user start sinc-respaldo.service
Con el servicio definido con systemctl --user
, podemos crear un fichero .timer
que lo active automáticamente cada hora.
Ejemplo: Crear un .timer
para ejecutar el servicio de sincronización cada hora
- Archivo de unidad
.timer
Guarda este archivo como ~/.config/systemd/user/sinc-respaldo.timer
:
[Unit]
Description=Ejecutar sincronización cada hora
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
OnCalendar=hourly
: ejecuta el servicio al comienzo de cada hora (por ejemplo, a las 10:00, 11:00, etc.)Persistent=true
: si el equipo estuvo apagado y vuelve a encenderse, ejecuta de forma retroactiva las tareas perdidas.
- Activar el timer
$ systemctl --user daemon-reload
$ systemctl --user enable sinc-respaldo.timer
$ systemctl --user start sinc-respaldo.timer
- Verificar el estado y la siguiente ejecución
$ systemctl --user status sinc-respaldo.timer
$ systemctl --user list-timers
- Ejemplo de salida con
list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
2025-07-15 02:00:00 CET 25min 2025-07-15 01:00:01 CET 34s ago sinc-respaldo.timer sinc-respaldo.service
¿Qué has logrado?
Con esta configuración, tu sistema sincroniza las carpetas automáticamente cada hora sin intervención.
Además, al usar systemctl --user
, se mantiene dentro del entorno del usuario sin requerir acceso root.
Ejecutar un servicio al iniciar sesión del usuario
Para lograrlo con systemd --user
, puedes configurar el timer con la opción OnStartupSec
, o directamente usar default.target
si el servicio debe ejecutarse siempre que se cargue el entorno del usuario.
Ejemplo de archivo sinc-respaldo.timer
para ejecutarse al iniciar sesión:
[Unit]
Description=Ejecutar sincronización al iniciar sesión
[Timer]
OnStartupSec=30
Persistent=true
[Install]
WantedBy=timers.target
OnStartupSec=30
: ejecuta el servicio 30 segundos después de que se cargue el entorno del usuario (es decir, justo al iniciar sesión gráfica o shell).Persistent=true
: si el equipo estuvo apagado y la ejecución estaba pendiente, se lanza retroactivamente.
Activación como siempre:
$ systemctl --user daemon-reload
$ systemctl --user enable sinc-respaldo.timer
$ systemctl --user start sinc-respaldo.timer
¿Qué hacen OnBootSec
, OnUnitActiveSec
y similares?
Estas opciones permiten definir el momento y frecuencia de ejecución del servicio en relación con eventos específicos del sistema.
OnStartupSec=
Ejecuta el servicio después de que se haya cargado el entorno de usuario.
Similar aOnBootSec
, pero específico para timers definidos consystemctl --user
.OnUnitInactiveSec=
Similar al anterior, pero mide el tiempo desde que el servicio se detuvo, no desde que se activó.
OnUnitActiveSec=
Relanza el servicio un intervalo de tiempo después de su última ejecución.
Por ejemplo:
OnUnitActiveSec=1h
→ ejecuta el servicio cada hora, pero contado desde la última vez que se ejecutó (no desde el inicio de sesión).
OnBootSec=
Ejecuta el servicio después del arranque del sistema.
Por ejemplo:
OnBootSec=5min
→ ejecuta el servicio 5 minutos después de que el sistema haya arrancado.