Runit: Ejecutando scripts al inicio

Publicado por Diego Córdoba el

Hoy vamos a aprender a crear un script de inicio en una distro Runit como Antix o Void Linux.

Ya hemos hablado en un post anterior sobre cómo configurar un script para que se ejecute al inicio de una distro systemd y cómo hacerlo en SysV Init, Hoy vamos a ver cómo hacerlo en una distro Runit.

Por cierto, este post es documentación adicional a lo que expliqué en el canal de youtube, no olviden suscribirse! Es de gran ayuda para seguir generando contenido! 🙂

Supongamos que ya hemos escrito nuestro ejecutable de inicio, sea un script, un binario, cualquier cosa que podamos ejecutar en el sistema por medio de una terminal de comandos.

Supongamos que lo hemos llamado «miscript.sh«, y lo hemos almacenado donde corresponde, en /usr/local/bin, y convenientemente le hemos dado permisos de ejecución.

El primer paso es crear un directorio de servicio dentro de /etc/sv, con el nombre que identifique a nuestro script:

$ sudo mkdir /etc/sv/miscript

Ahí dentro crearemos un archivo llamado run, con permisos de ejecución, y cuyo contenido permitirá lanzar nuestro script, por ejemplo:

#!/bin/bash

/usr/local/bin/miscript.sh

exec sleep infinity

Luego:

$ sudo chmod +x /etc/sv/miscript/run

Con esto ya tendremos casi toda la configuración lista!

Este script va a hacer la llamada a nuestro script de /usr/local/bin.

¿Por qué no escribir aquí mismo el contenido del script?

Sí, ya se, es una tentación hacerlo, un archivo ejecutable que llama a otro archivo ejecutable y nada más, ¿tiene sentido?

La respuesta es SI, tiene sentido, y es conveniente hacerlo de esta forma, por varias razones:

  • Principio de responsabilidad única: El archivo run de Runit tiene una sola misión: gestionar el proceso (decirle al sistema cómo lanzarlo, con qué usuario y qué variables de entorno). Si metemos todo ahí dentro, podríamos tener un archivo gigante y difícil de leer/mantener.
    Además, al usar archivos separados, separamos la lógica del programa, de la lógica de la configuración de servicio.
  • Portabilidad: Si mañana movemos nuestro script de nuestra distro Runit y lo llevamos a una distro systemd, o SysVInit, sería más difícil hacerlo si toda la lógica estuviera en el archivo run.
    De esta forma, sería cuestión de mover el script desde el /usr/local/bin de una distro, al mismo directorio de otra distro, y configurar su lanzamiento automático según el gestor de servicios que utilice.
  • Orden: en Linux, el lugar estándar del FHS para guardar scripts y ejecutables de usuario es /usr/local/bin, y si bien se pueden almacenar en cualquier lado, siempre es mejor mantener el orden. De esta forma, cualquier otro usuario que utilice el sistema sabrá que los binarios y scripts personalizados están ahí, sin necesidad de decírselo.

📚 ¿Querés saber más de GNU/Linux y sus detalles? Sumate a nuestro curso!

¿Por qué no lleva el & al final de la línea?

Este es un punto importante: Runit no ejecuta las tareas en forma secuencial, sino que lanza el servicio y se destina un proceso a monitorear su ejecución.

Si el proceso se cae, Runit lo intentará lanzar de nuevo. Si colocamos el &, runit lanzará el servicio en segundo plano, y el proceso que debería monitorearlo no va a poder verlo, va a suponer que se cayó, e intentará lanzarlo nuevamente.

A propósito de esto, Runit es especialmente útil para correr servicios que quedan en ejecución en el sistema, proceso residente, servicio que atiende un puerto de red, etc.

Por eso es que, en nuestro caso particular, tratándose de un script que se ejecuta una sola vez y muere, y su función es esa, debemos modificar un poco el archivo run, añadiendo al final el «exec sleep infinity».

Esta línea permite que el script se ejecute, pero el proceso runit que lo lanzo siga en ejecución, en espera infinita, evitando que Runit vuelva a lanzarlo.

Gestión manual de un script de inicio en Runit

Una vez que hemos creado el archivo run, podemos ejecutar nuestro script por línea de comandos de manera manual usando el comando sv:

$ sudo sv up miscript

Al ejecutarlo Runit lanzará el servicio miscript, que a su vez ejecutará nuestro script. Nuestro script terminará, y el servicio quedará en ejecución con el sleep, evitando que Runit lo ejecute nuevamente.

Y podemos detenerlo con:

$ sudo sv down miscript

Gestión automática

Para hacer que el script se ejecute automáticamente al inicio de la distro, de manera similar a SysV Init, debemos crear un enlace simbólico, sólo que aquí será de manera manual (Runit apunta a la simplicidad).

Runit corre los servicios que se encuentren en /etc/service/, por lo que deberemos crear un enlace simbólico ahí dentro, que apunte al directorio de servicio en /etc/sv (no al run, sino al directorio).

$ sudo ln -s /etc/sv/miscript /etc/service/

De esta forma, al siguiente reinicio se ejecutará el script.

Para evitar que se ejecute al inicio, obviamente, eliminamos el enlace simbólico:

$ sudo rm /etc/service/miscript

📚 ¿Querés saber más de GNU/Linux y sus detalles? Sumate a nuestro curso!


Y con esto hemos llegado al final!

Una breve guía para ejecutar scripts de inicio en sistemas Runit como Antix o Void Linux.

Espero que les sea de utilidad! Cualquier duda ya saben, estamos en la comunidad JuncoTIC en Telegram, no olviden pasarse por ahí 🙂

Hasta la próxima!


¿Querés aprender más? 📚

👉 Visitá nuestros cursos!
💬 Y si tenés dudas, o querés dejarnos tus comentarios sumate a la Comunidad JuncoTIC en Telegram!
¡Te esperamos!

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mgtr. Teleinformática - Instructor GNU/Linux, Programación, Redes TCP/IP, criptografía y ciberseguridad. - (Ex) Docente universitario e investigador