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 enRequiresfalla, este servicio también terminará.Wants: Indica una dependencia flexible. Si un servicio enWantsfalla, 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 porExecStartes el proceso principal. Si el script de inicio usanohup &, el servicio podría ser terminado prematuramente.forking: El proceso iniciado porExecStartcrea un proceso hijo y el padre termina. El hijo se convierte en el proceso principal.oneshot: Similar asimple, 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 asimple, pero espera una señal D-Bus específica antes de considerar el servicio iniciado.notify: Similar asimple, pero el servicio envía una señal de notificación a systemd una vez que ha terminado de inicializarse.idle: Similar asimple, 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 formatoclave=valor. Estas variables pueden ser referenciadas en el archivo.servicecomo$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 deExecStart.ExecStartPost: Comandos que se ejecutan después deExecStart.ExecStopPost: Comandos que se ejecutan después deExecStop.
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 recibeSIGTERMy los subprocesos recibenSIGKILL.none: Ningún proceso es terminado; solo se ejecutan los comandosExecStop.
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.targetsignifica que el servicio se iniciará cuando el sistema alcence el estado multiusuario. Al ejecutarsystemctl enable <nombre_servicio></nombre_servicio>, se crea un enlace simbólico al archivo.serviceen 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