montar_un_programa_como_servicio_en_systemd
Diferencias
Muestra las diferencias entre dos versiones de la página.
montar_un_programa_como_servicio_en_systemd [2025/04/04 14:39] – creado hispa | montar_un_programa_como_servicio_en_systemd [Fecha desconocida] (actual) – editor externo (Fecha desconocida) 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | <WRAP round box> | ||
+ | ====== Montar un programa como servicio en systemd ====== | ||
+ | </ | ||
+ | <WRAP tabs> | ||
+ | * [[Chuletas y apuntes diversos]] | ||
+ | </ | ||
+ | A veces tenemos la necesidad de hacer que un programa se ejecute al iniciarse el ordenador para efectuar cualquier tarea que se nos ocurra, en este caso, y para que nos sirva como ejemplo práctico, ejecutar un bot que nos informe sobre la IP pública de nuestra red local. Podemos hacerlo con cron, de una forma tan simple como escribir en crontab la siguiente línea: | ||
+ | < | ||
+ | @reboot python / | ||
+ | </ | ||
+ | |||
+ | En este caso, el ordenador intentará ejecutar el programa **IP_Bot.py**, | ||
+ | |||
+ | Y si todo lo demás está bien, Linux iniciará nuestro programa durante el proceso de arranque. Sin embargo, montar nuestro programa como un servicio de systemd tiene la ventaja de poder monitorizar mejor el estado de funcionamiento de nuestro programa, así como reiniciarlo en el caso de que éste dejara de funcionar por el motivo que fuera. | ||
+ | |||
+ | Y para que systemd pueda ejecutar nuestro programa en el arranque, lo primero es decirle cómo queremos que se ejecute, con este pequeño archivo: | ||
+ | |||
+ | <code bash / | ||
+ | [Unit] | ||
+ | Description=IP_Bot, | ||
+ | After=network.target metronome.service mosquitto.service | ||
+ | |||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | Restart=always | ||
+ | |||
+ | [Install] | ||
+ | WantedBy = multi-user.target | ||
+ | </ | ||
+ | |||
+ | Este archivo debe ubicarse en la ruta **/ | ||
+ | |||
+ | Con «ExecStart» le damos la ruta del archivo a ejecutar, que en este caso es un script de bash llamado «IP_Bot» que a su vez redirige a mi programa en python. Hay un motivo para esto, como veremos más adelante. | ||
+ | |||
+ | «Restart=always» le dice a systemd que debe reiniciar este servicio si se interrumpiera por cualquier motivo, de manera que siempre lo tendremos funcionando. | ||
+ | |||
+ | Con «WantedBy = multi-user.target» le decimos al ordenador en qué estado del inicio de la máquina queremos que se ejecute nuestro servicio. | ||
+ | |||
+ | Y hecho esto, vamos a preparar el script que hemos pedido a systemd que nos ejecute: | ||
+ | |||
+ | <code bash / | ||
+ | #!/bin/bash | ||
+ | ### BEGIN INIT INFO | ||
+ | # Provides: | ||
+ | # Required-Start: | ||
+ | # Required-Stop: | ||
+ | # Default-Start: | ||
+ | # Default-Stop: | ||
+ | # Short-Description: | ||
+ | ### END INIT INFO | ||
+ | |||
+ | cd / | ||
+ | python3 IP_Bot.py > /dev/null | ||
+ | </ | ||
+ | |||
+ | En las dos últimas líneas de este script cambiamos el directorio, y luego ejecutamos el programa en python que contiene el código del bot, que es «IP_Bot.py». En las líneas anteriores se especifican, | ||
+ | |||
+ | <code bash> | ||
+ | cd / | ||
+ | python3 IP_Bot.py > /dev/null | ||
+ | </ | ||
+ | |||
+ | Una vez guardado el script de arranque de la aplicación, | ||
+ | |||
+ | < | ||
+ | sudo chmod +x IP_Bot | ||
+ | </ | ||
+ | |||
+ | Ahora habilitamos el servicio: | ||
+ | |||
+ | < | ||
+ | sudo systemctl enable ip_bot.service | ||
+ | </ | ||
+ | |||
+ | Y por último lo ponemos en marcha: | ||
+ | |||
+ | < | ||
+ | sudo systemctl start ip_bot.service | ||
+ | </ | ||
+ | |||
+ | Para comprobar que el servicio se encuentra en funcionamiento, | ||
+ | |||
+ | < | ||
+ | sudo systemctl status ip_bot.service | ||
+ | </ | ||
+ | |||
+ | Lo que debería darnos una salida semejante a ésta: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | El «active» en verde nos indica que el servicio está funcionando. Esto no evitaría que, de haber algún error en el programa (en este caso en el script de python «IP_Bot.py»), | ||
+ | |||
+ | {{tag> chuletas_y_apuntes_diversos linux}} |