Recargando un servidor de Node.js con WebSocket

Un sencillo servidor corriendo sobre Node.js puede permitir la recarga sin interrupciones, de manera amistosa, algo parecido al reload de Apache u otros demonios en Linux. Para ello sólo es necesario que haya un proceso padre que lance hijos y les envíe señales según sea necesario. Sin embargo el cierre de las conexiones esperando a que estas terminen puede dar algunas complicaciones cuando hay un WebSocket.

La gestión de padre e hijos se puede hacer con el módulo cluster. En este ejemplo el script a lanzar manualmente es master.js. Él a su vez lanzará al script server.js y le pasará las señales SIGHUP para recargar el servidor (terminar amistosamente) o SIGTERM para terminar sin piedad.

master.js:

'use strict';

var cluster = require('cluster');
const path = require('path');

cluster.setupMaster({
  exec: path.join(__dirname, 'server.js')
});

//fork the first process
cluster.fork();

process.on('SIGHUP', function () {
  var new_worker = cluster.fork();
  new_worker.once('listening', function () {
    //stop all other workersS
    for (var id in cluster.workers) {
      if (id === new_worker.id.toString()) continue;
      cluster.workers[id].process.kill('SIGHUP');
    }
  });
}).on('SIGTERM', function () {
  for (var id in cluster.workers) {
    cluster.workers[id].process.kill('SIGTERM');
  }
});

[…] (continuar leyendo)

Fedora 20, Eclipse y Google Talk

Eclipse y el plugin de Google Talk no se llevan bien los toques en Fedora 20. Cada vez que Eclipse necesita renderizar contenido como si de un navegador web se tratase, intenta utilizar WebKit y se cierra inesperadamente. Por ejemplo al abrir su Marketplace.

La solución oficial no sé muy bien si corresponde a Eclipse o a Google Talk, pero de momento las dos formas más famosas de arreglarlo son:

  • Eliminar Google Talk:
# yum erase google-talkplugin
  • O bien editar el fichero de configuración de Eclipse (eclipse.ini) y esta opción para que utilice Mozilla:
-Dorg.eclipse.swt.browser.DefaultType=mozilla

Fuente → Google Talk plugin presence breaks Eclipse in Fedora 20 @ Chris Daniel.

«cron» y el último día de cada mes

El demonio cron facilita las ejecuciones programadas cuando se trata del primer día del mes. Sin embargo para el último día de cada mes hay que usar un poco de ingenio y otras herramientas del sistema. Una manera:

30 23 * * * [[ $(date +'%d') -eq $(cal | awk '!/^$/{ print $NF }' | tail -1) ]] && /ruta/absoluta/al/script 1>/dev/null 2>&1

Que cada día a las 2330 comprobará si se trata del último día del mes:

  1. Obtiene el día del mes.
  2. Obtiene el calendario del mes actual.
    1. Extrae el final de cada línea del calendario.
    2. Se queda con la última de esas líneas.
  3. Si el día actual es igual al último día del mes obtenido, se ejecuta lo que le digamos y las salidas las manda a /dev/null.

Fuente → The UNIX and Linux Forums.

Compartir un hash multidimensional entre hilos en Perl

De cara a la concurrencia es frecuente hacer un script que vaya lanzando hilos según sea necesario. Y no mucho menos habitual es también que tales hilos compartan algunas variables. Un ejemplo puede ser un sistema que recibe peticiones y mientras tanto las va lanzando en hilos.

A priori parece la mar de sencillo. Usando threads y threads::shared con un array o un hash se resuelve el asunto. Sin embargo si no hubiera más remedio que utilizar un hash y de más de una dimensión vendría el problema. Con shared se comparte un nivel del hash, de manera que si se tiene compartido %miscosas y se necesita ahora utilizar $miscosas{1339953221}{detalles}{algo} vamos a tener un error de vuelta del estilo invalid value for shared scalar.

Para ello hay dos soluciones posibles […] (continuar leyendo)

Módulos en Perl multiplataforma

El lenguaje Perl permite escribir scripts multiplataforma sin demasiados problemas. Aunque siempre puede haber algunos impedimentos como por ejemplo la carga de módulos que no están disponibles para todos los sistemas operativos. Aquí va un ejemplo con Linux y Windows.

Puede darse el caso de necesitar un script que pueda correr como demonio en Linux o servicio de sistema en Windows. Para el segundo entorno el asunto se complica dado que se necesita de un módulo como Win32::Daemon, el cual si intentamos endosarle a Linux nos dirá que tararí. Y es que […] (continuar leyendo)