Gestión de Servicios del Sistema en Linux con systemd

Registrar una aplicación como un servicio del sistema permite controlarla mediante comandos como systemctl y service. Esto facilita su inicio, detención, consulta de estado y configuración para que se inicie automáticamente al arrancar el sistema.

Para registrar un servicio, se debe crear un archivo de configuración con extensión .service y ubicarlo en el directorio /usr/lib/systemd/system/.

Comandos Comunes

Los comandos systemctl y service ofrecen funcionalidades similares para la gestión de servicios. La sintaxis general es: systemctl <acci> <nombre_servicio></nombre_servicio></acci> o service <nombre_servicio> <acci></acci></nombre_servicio>.

  • systemctl status <nombre_servicio></nombre_servicio>: Muestra el estado actual del servicio.
  • systemctl start <nombre_servicio></nombre_servicio>: Inicia el servicio.
  • systemctl stop <nombre_servicio></nombre_servicio>: Detiene el servicio.
  • systemctl restart <nombre_servicio></nombre_servicio>: Reinicia el servicio.
  • systemctl enable <nombre_servicio></nombre_servicio>: Configura el servicio para que se inicie automáticamente al arrancar el sistema.
  • systemctl disable <nombre_servicio></nombre_servicio>: Deshabilita el inicio automático del servicio.
  • systemctl list-units --type=service: Lista todos los servicios que se están ejecutando actualmente.

Después de modificar un archivo .service, es necesario ejecutar systemctl daemon-reload para que los cambios surtan efecto.

Formato del Archivo .service

Un archivo de servicio, por ejemplo sshd.service, se estructura en varias secciones:

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Sección [Unit]

Esta sección proporciona metadatos sobre el servicio:

  • Description: Una breve descripción del servicio.
  • Documentation: Enlaces a la documentación relevante.
  • After: Especifica que el servicio debe iniciarse después de los servicios listados.
  • Before: Especifica que el servicio debe iniciarse antes que los servicios listados.
  • Requires: Indica una dependencia estricta. Si un servicio en Requires falla, este servicio también terminará.
  • Wants: Indica una dependencia flexible. Si un servicio en Wants falla, este servicio continuará ejecutándose.

Sección [Service]

Define cómo se ejecuta el servicio:

Tipo de Inicio (Type)

  • simple (por defecto): El proceso iniciado por ExecStart es el proceso principal. Si el script de inicio usa nohup &, el servicio podría ser terminado prematuramente.
  • forking: El proceso iniciado por ExecStart crea un proceso hijo y el padre termina. El hijo se convierte en el proceso principal.
  • oneshot: Similar a simple, pero el servicio se considera iniciado una vez que el comando termina. systemd esperará a que este comando finalice antes de iniciar otros servicios.
  • dbus: Similar a simple, pero espera una señal D-Bus específica antes de considerar el servicio iniciado.
  • notify: Similar a simple, pero el servicio envía una señal de notificación a systemd una vez que ha terminado de inicializarse.
  • idle: Similar a simple, pero retrasa la ejecución hasta que todos los demás trabajos de inicio estén completos. Útil para evitar mezclar la salida del servicio con la de otros.

Comandos de Ejecución

  • EnvironmentFile: Especifica un archivo que contiene variables de entorno en formato clave=valor. Estas variables pueden ser referenciadas en el archivo .service como $clave.
  • ExecStart: El comando que se ejecuta al iniciar el servicio.
  • ExecReload: El comando que se ejecuta al reiniciar el servicio.
  • ExecStop: El comando que se ejecuta al detener el servicio.
  • ExecStartPre: Comandos que se ejecutan antes de ExecStart.
  • ExecStartPost: Comandos que se ejecutan después de ExecStart.
  • ExecStopPost: Comandos que se ejecutan después de ExecStop.

Modo de Detención (KillMode)

Define cómo se detienen los procesos del servicio:

  • control-group (por defecto): Todos los procesos dentro del cgroup de control del servicio son terminados.
  • process: Solo se termina el proceso principal.
  • mixed: El proceso principal recibe SIGTERM y los subprocesos reciben SIGKILL.
  • none: Ningún proceso es terminado; solo se ejecutan los comandos ExecStop.

PrivateTmp

Cuando se establece en true, el servicio utiliza un directorio tmp privado, aislado del sistema. Este directorio se crea al iniciar el servicio y se elimina al detenerlo. Es importante tener en cuenta que los archivos temporales del servicio se escribirán en este directorio aislado.

Sección [Install]

Define cómo se instala y habilita el servicio:

  • WantedBy: Especifica el "target" (grupo de servicios) al que pertenece el servicio. Por ejemplo, WantedBy=multi-user.target significa que el servicio se iniciará cuando el sistema alcence el estado multiusuario. Al ejecutar systemctl enable <nombre_servicio></nombre_servicio>, se crea un enlace simbólico al archivo .service en el subdirectorio <multi-user.target>.wants/</multi-user.target> dentro de /etc/systemd/system/.

Plantilla de Archivo .service Simplificada

Aquí hay un ejemplo mínimo de un archivo de servicio:

[Unit]
Description=simulator

[Service]
Type=simple
ExecStart=/home/root/simulator/start.sh
ExecStop=/home/root/simulator/stop.sh

[Install]
WantedBy=multi-user.target

Etiquetas: systemd systemctl servicio linux gestión de servicios

Publicado el 8-26 05:08