Servicios en Linux
Guía rápida donde se explican los conceptos básicos sobre los servicios en Linux.
Fecha: 07 Aug 2023 - Autor: Antonio
Formación: The complete Devops bootcamp
Post en Categoría: Devops
Etiquetas: / apuntes / linux / how-to /
- Manejo básico de los servicios
- Crear un servicio
- Configurar un servicio para arrancar al inicio del sistema
Los servicios en Linux son programas y/o herramientas diseñados para correr 24x7 en nuestros servidores. Queremos que estos programas se arranquen con el inicio del servidor y que en caso de caída del programa o del servidor, se recuperen automáticamente, además suelen ser ser arrancados en orden concreto por tener a veces dependencias unos de otros.
Manejo básico de los servicios
Disponemos de dos comandos, el genérico service
y el mejorado systemctl
. En realidad service
está utilizando systemctl
por debajo. En este documento utilizaremos este último, pero son intercambiables (Cada uno con su sintáxis específica).
# Arrancar un servicio (httpd sería un Servidor Apache)
$ systemctl start httpd
# Parar un servicio
$ systemctl stop httpd
# Chequear el estado de un servicio
$ systemctl status httpd
# Habilitar un servicio para que arranque en el inicio del servidor
$ systemctl enable httpd
# Deshabilitar un servicio para que NO arranque en el inicio del servidor
$ systemctl disable httpd
Crear un servicio
En ocasiones tendremos que configurar manualmente los servicios, otras veces se configuran automáticamente en la instalación del software. Aquí explicaremos la configuración manual de servicios.
Digamos que tenemos un sencillo servidor web escrito en python en la ruta /opt/code/my_app.py
, de modo que si lo arrancamos con el interprete de Pyton(/usr/bin/python3
) y hacemos un curl http//localhost:5000
, nos debe devolver un HTTP Response 200.
Con esta premisa vamos a configurarlo como un servicio para que se arranque en el inicio del servidor y la gestión de parada y arranques manuales sean tan sencillas como ejecutar:
$ systemctl start my_app
$ systemctl stop my_app
Como vimos al principio el comando systemctl
se emplea para manejar los servicios del sistema, así pues debemos configurar nuestro programa como un servicio más.
Por lo general los ficheros de los servicios están almacenados en la ruta /etc/systemd/system
. En dicha ruta crearemos nuestro fichero con el nombre que queramos darle a nuestro servicio, en nuestro caso será my-app
y la extensión del fichero debe ser .service
. Veamos como queda el fichero por dentro:
# file: "my-app.service"
[Service]
ExecStart=/usr/bin/python3 /opt/code/my-app.py
ExecStart
es el comando que ejecutaríamos en el CLI para arrancar el programa normalmente.
Con esto tendríamos nuestro servicio configurado. Ahora debemos ejecutar systemctl daemon-reload
para hacer que el sistema incorpore este nuevo fichero como servicio del sistema. Ya podemos manejarlo como un servicio más en nuestro sistema:
$ systemctl start my-app
$ systemctl status my-app
$ systemctl stop my-app
Configurar un servicio para arrancar al inicio del sistema
Ya tenemos el servicio configurado y corriendo. Ahora queremos que se levante automáticamente en el inicio del sistema. Para ello debemos añadir una nueva sección en nuestro fichero my-app.service
, llamada [Install]
. Contendrá lo siguiente:
# file: "my-app.service"
[Service]
ExecStart=/usr/bin/python3 /opt/code/my-app.py
[Install]
WantedBy=multi-user.target
Configuraciones adicionales
Podemos definir en el fichero my-app.service
otras configuraciones tales como: definición del servicio, dependencias con otros servicios o si queremos que se reinicie automáticamente en caso de caida del mismo.
Añadimos estas líneas a nuestro fichero y posteriormente explicamos los nuevos campos.
# file: "my-app.service"
[Unit]
Description=My python web application
[Service]
ExecStart=/usr/bin/python3 /opt/code/my-app.py
ExecStartPre=/opt/code/configure_db.sh
ExecStartPost=/opt/code/email_status.sh
Restart=Always
[Install]
WantedBy=multi-user.target
-
Description: Dentro de la sección
[Unit]
, añadimos este campo para añadir una breve descripción de lo que hace el servicio. Será mostrada cuando hagamos unsystemctl status my-app
. -
ExecStartPre: Dependencias que deben cumplirse antes de que nuestro servicio arranque. En este caso debe haberse ejecutado el script
configur_db.sh
. -
ExecStartPost: Programas que se ejecutarán tras el arranque correcto de nuestro serivicio. En el ejemplo
email_status.sh
. -
Restart: Si queremos que nuestro servicio se reinicie automáticamente en caso de caída del mismo tenemos que definir este campo con
Always
.
Estas son algunas de las configuraciones básicas que podemos incluir en nuestros servicios. Por lo general con otros programas y herramientas suelen ser fichero mucho más extensos y con muchos más campos. Pero para entender el funcionamiento básico de los servicios en Linux es suficiente con este ejemplo.