cover image
IoT

Uso de Systemd para iniciar una aplicación Python con Virtualenv

Systemd es genial para iniciar y detener servicios en Linux. Cuando quieras iniciar una aplicación Python que utiliza virtualenv, debes tener especial cuidado. Este artículo explica cómo crear un script systemd usando el ejemplo de la aplicación aplicación de código abierto Timetagger Python.

Systemd

En los sistemas Linux, systemd es un sistema de inicio utilizado para arrancar el espacio de usuario y gestionar los procesos de usuario. En el momento de su introducción fue controvertido, pero ahora es utilizado por la mayoría de todas las distribuciones modernas de Linux.

Así que cuando quieras ejecutar automáticamente una aplicación en cada inicio del sistema operativo Linux, necesitas crear un archivo de configuración. Más adelante mostraré cómo hacerlo.

Virtualenv

Cuando se instalan aplicaciones Python que tienen dependencias de librerías, es muy útil utilizar el servicio de virtualenv. Con la ayuda de virtualenv puedes aislar las aplicaciones Python para que las dependencias de las bibliotecas no interfieran entre sí. Esto es necesario si tienes más aplicaciones Python instaladas al mismo tiempo en tu sistema. Desde Python 3.3, un subconjunto de virtualenv está integrado bajo el módulo venv.

Timetagger

Timetagger es una aplicación de código abierto de seguimiento del tiempo en Python desarrollada por Almar Klein. Lo uso como ejemplo aquí porque encuentro Timetagger útil en mi trabajo. Cuenta con una cómoda interfaz web para el seguimiento de su tiempo y también tiene una API. Usando la CLI de Timetagger puedes iniciar y detener el seguimiento del tiempo en la línea de comandos. Esto es especialmente útil para los desarrolladores de software.

Cuando aloja la aplicación usted mismo, probablemente quiere ejecutarla automáticamente en cada inicio de su sistema. Ahí es donde entra en juego el script systemd.

Script systemd

Necesitas instalar Timetagger con virtualenv para poder usar el script systemd.

Después de haber clonado Timetagger desde GitHub, puedes ejecutar los siguientes comandos para instalarlo con virtualenv:

cd timetagger

python3 -m venv venv

. venv/bin/activate

pip3 install -r requirements.txt

Ahora todas las dependencias están instaladas usando virtualenv.

Es necesario crear el script de servicio systemd (timetagger.service) en el directorio del sistema utilizando un editor de texto:

/etc/systemd/system/timetagger.service

[Unit]
Description=Timetagger service

[Service]
User=Su nombre de usuario de Linux
WorkingDirectory=Su carpeta timetagger
ExecStart=Su carpeta timetagger/venv/bin/python3 -m timetagger &

[Install]
WantedBy=multi-user.target

Reemplace Su carpeta timetagger con el nombre del directorio real de Timetagger en su sistema.

Yo uso el & al final del comando para hacer que Timetagger se ejecute en segundo plano.

La clave para ejecutar una aplicación Python que ha sido instalada vía virtualenv es ejecutar Python a través de la carpeta venv/bin. Entonces se utiliza el conjunto correcto de bibliotecas.

Ten en cuenta que necesitas derechos de administrador para crear el archivo timetagger.service.

Ahora puedes iniciar timetagger con:

sudo systemctl start timetagger

Para que timetagger se ejecute automáticamente cada vez que se inicie el sistema, habilítalo de la siguiente manera

sudo systemctl enable timetagger

Detener Timetagger

Cuando haya iniciado Timetagger de la manera descrita anteriormente, puede detenerlo enviándole una señal SIGSTOP:

kill -SIGSTOP pid

Puedes obtener el pid (id de proceso) mediante el comando ps ax. Busca el nombre del Timetagger.

Conclusión

Ejecutar aplicaciones Python que usan virtualenv automáticamente en systemd no es ciencia de cohetes. Espero que con este artículo te haya mostrado cómo hacerlo.

Referencias

Imagen de portada de OpenAI Dall-E2: "Serpiente amarilla con un etiquetador de tiempo".

Published 22 Oct 2022

Creative Commons License
.
Thomas Derflinger

Escrito por Thomas Derflinger

Soy un empresario visionario y desarrollador de software. En este blog escribo principalmente sobre programación web y temas relacionados como el IoT.