Administración de servicios y demonios (RSA-07)

La ruta del SysAdmin 15 de jul. de 2025

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 (como default.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

  1. 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.
  1. Activar el timer
$ systemctl --user daemon-reload
$ systemctl --user enable sinc-respaldo.timer
$ systemctl --user start sinc-respaldo.timer
  1. Verificar el estado y la siguiente ejecución
$ systemctl --user status sinc-respaldo.timer
$ systemctl --user list-timers
  1. 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 OnBootSecOnUnitActiveSec 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 a OnBootSec, pero específico para timers definidos con systemctl --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.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux