sábado, 28 de marzo de 2015

Creando un servicio TCP con systemd en el Intel Edison


Hola!

No hace mucho en el trabajo me encargaron desarrollar un par de servicios que corrieran en Ubuntu. Yo conocía UpStart, que era, y aún es, el sistema oficial para cargar todos los procesos de Ubuntu, incluyendo los servicios de fondo. Y empecé a desarrollar pensando en él hasta que leyendo me enteré de que Ubuntu va a abandonar ese sistema por systemd. Ya llevaba bastante avanzado mi proyecto y quería saber si valdría la pena volver a cambiarlo para usar systemd. El artículo que más me sirvió para entender fue este de Lennart Poettering y lo que más me llamó la atención fue el Socket Activation Protocol. Es una excelente forma de arrancar servicios de forma paralela. Ya que un "servicio" puede ser tanto un servidor HTTP como cualquier programa que no requiera interfaz gráfica, quería saber si lo podía usar en mi Intel Edison... y sí pude! Aquí están los pasos de cómo lo hice.

El servicio de prueba consiste en lo siguiente: Un servidor que crea un hilo por cada cliente conectado. Estos sólo envían un mensaje y cierran la conexión. El código está basado en el artículo mencionado. Los pasos a resaltar son:
  1. Detección de la señal SIGTERM.- Esta señal la usa systemd para indicarle a los servicios de fondo cuando deben finalizar.
  2. Detectar si el socket de escucha lo provee systemd ó debemos crearlo nosotros. Lo crea systemd cuando el programa se inicia como un servicio de fondo. Se debe crear uno por nuestra cuenta si el programa se lanza de forma explícita(ej: línea de comando)
  3. Escuchar conexiones y crear un hilo por cada cliente.
  4. Cuando se reciban la señal SIGTERM: cerrar el socket de escucha, esperar que acaben los hilos de los clientes y finalizar el programa.

El mismo código fuente funciona en Ubuntu 14.04 y en el Linux del Intel Edison. Sólo hay una diferencia al momento de construir el proyecto:

En Ubuntu tienes que enlazar con:
-lsystemd-journal -lsystemd-daemon -lpthread
Para el Intel edison, al enlazar usas:
-lsystemd -lpthread

El código, el archivo CMake y los scripts de systemd para usar el proyecto lo pueden descargar del sgte. enlace:
https://drive.google.com/file/d/0B64FjViHrZqpLWxnanpVSmpXOU0/view?usp=sharing

Cualquier consulta en lo comentarios.
Happy Coding! :)