Muchas veces toca instalar aplicaciones de forma manual en nuestros servidores y nos encontramos con la necesidad de dejarlos corriendo de forma permanente, es decir, que sean resistentes a caídas y reinicios, así podemos estar tranquilos que ante cualquier eventualidad nuestro sistema funcionará de forma continua.

La manera de hacer esto es aprovechando el sistema de inicio que trae cada distribución, el cual tradicionalmente se encarga de gestionar los demonios del sistema.

Los sistemas de inicio más conocidos son:

  • System V
  • Upstart
  • Systemd

Siendo este último el que se utiliza en la mayoría de las distribuciones más populares de hoy en día (Ubuntu, CentOS, Fedora, etc), y por tanto bajo el que se guiará este texto.

Creando un demonio

Antes de configurar nuestro demonio, necesitamos tener un programa para endemoniar daemonizar.

Para este ejemplo utilizaremos un comando de python con el que podemos cargar un webserver de forma rápida y sencilla:

mkdir webtest && cd webtest
echo "Hola mundo!" | tee -a index.html
python -m SimpleHTTPServer 8000

Lo que hace el último comando es levantar un webserver en el directorio donde estás parado (webtest).

Haz la prueba y apunta tu browser a http://localhost:8000.

Cuando cierres la terminal el servidor se caerá, entonces, para que nuestro servicio siga corriendo forever vamos a crear el demonio.

Crea el siguiente archivo (como root):

/etc/systemd/system/pyweb.service

Y en él escribimos lo siguiente:

[Unit]
Description=Simple Python Webserver
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=felipe
WorkingDirectory=/home/felipe/webtest
ExecStart=python -m SimpleHTTPServer 8000

[Install]
WantedBy=multi-user.target

Qué significa cada cosa? Lo más importante:

  • After declara que el servicio debe iniciar cuando la red ya esté andando
  • User es tu usuario en la máquina
  • Restart indica que el servicio “always” debe volver a levantarse si por alguna razón se cae
  • ExecStart es el comando que ejecutará el servicio, en este caso nuestro webserver.
  • WorkingDirectory es el directorio donde se ejecutará el comando

Por último, comentar que el nombre que tomará el demonio será el de nuestro archivo sin la extensión, es decir pyweb.

Controlando el demonio ~(˘▾˘~)

Ahora que ya tenemos el servicio creado y sabemos su nombre, probemos arrancarlo:

sudo systemctl start pyweb

Para detenerlo:

sudo systemctl stop pyweb

Si quieres que quede corriendo de forma permanente (aún cuando reinicies la máquina):

sudo systemctl enable pyweb

Cualquier problema que tengas con tu daemon, puedes ver el log de systemd:

sudo systemctl status pyweb

Easy peasy.

Final notes

Si desarrollas APIs esta utilidad te puede ayudar a mantener tus servicios arriba sin preocuparte que por ejemplo tu proveedor te reinicie el servidor por mantención.

Por último, recomendarte explorar el resto de las directivas que provee systemd para generar servicios en la respectiva documentación.