node modulos documentación diccionario cuando creo comandos node.js child-process

node.js - modulos - Nodejs: el proceso se bloquea en la salida(Ctrl+C)



modulos node js (1)

Tengo un proyecto node.js que hace muchas cosas, genera procesos secundarios, abre un servidor http y socket.io, etc.

Cuando lo ejecuto desde la consola, cerrándolo con Ctrl+C , simplemente se cuelga. Desde webstorm, detener el proceso es un proceso de dos pasos, primero presiono para detener, luego necesito presionar el botón nuevamente, solo la segunda vez que el botón es un ícono de una calavera.

Ahora, entiendo que deja algo abierto o colgado, pero simplemente no puedo entender qué, traté de rastrear todos los lugares donde comienzo un proceso y me aseguré de matarlos correctamente.

¿Hay una manera de depurar esto y averiguar qué está haciendo que mi proceso se cuelgue? ¿Podría ser el registro que abre una secuencia de escritura y nunca se cierra? Ni siquiera estoy seguro de qué tipo de cosas hará que un proceso se detenga en SIGINT.

EDITAR: He descargado pstree para ver si alguno de los procesos secundarios que genera el proceso principal sigue vivo. Parece que todos terminan correctamente: el proceso del nodo principal es el único que queda.


Los scripts son responsables de apagar correctamente una vez que escuchan el evento SIGINT , ya que el controlador predeterminado (que detiene el proceso) está deshabilitado.

Echa un vistazo a este programa de ejemplo:

process.on(''SIGINT'', function() { console.log(''SIGINT''); }); console.log(''PID: '', process.pid); var http = require(''http''); // HTTP server to keep the script up long enough http.createServer(function (req, res) { res.writeHead(200, {''Content-Type'': ''text/plain''}); res.end(''Hello World/n''); }).listen(1337, ''127.0.0.1''); console.log(''Server running at http://127.0.0.1:1337/'');

Ejecutarlo y luego intentar matarlo: no funcionará . La señal SIGINT siempre se pasará a su controlador de señales de compilación personalizado. Para cerrar correctamente el proceso, deberá llamar manualmente a process.exit() :

process.on(''SIGINT'', function() { console.log(''SIGINT''); process.exit(); }); console.log(''PID: '', process.pid); var http = require(''http''); http.createServer(function (req, res) { res.writeHead(200, {''Content-Type'': ''text/plain''}); res.end(''Hello World/n''); }).listen(1337, ''127.0.0.1''); console.log(''Server running at http://127.0.0.1:1337/'');

process.exit() será:

  1. Establecer algunas banderas internas
  2. Call los manejadores process.on(''exit'')
  3. Llamada process.reallyExit
  4. Que llamará a la función exit() C ++, por lo tanto process.exit() es final y causará un cierre (a menos que bloquee la ejecución con un bucle sin fin en su controlador on(''exit'') ).

Larga historia corta: Su código probablemente escucha SIGINT alguna parte. Puede obtener una lista de esos oyentes a través de:

var listeners = process.listeners(''SIGINT'');

Incluso puedes imprimirlos bastante en la consola:

for (var i = 0; i < listeners.length; i++) { console.log(listeners[i].toString()); }

Usando la información que proporcioné anteriormente, puede compilar fácilmente otro manejador de SIGINT que mostrará una lista de todos los manejadores y luego saldrá del proceso de manera limpia, con suerte dirigiendo su camino hacia los traviesos :

process.on(''SIGINT'', function() { console.log(''Nice SIGINT-handler''); var listeners = process.listeners(''SIGINT''); for (var i = 0; i < listeners.length; i++) { console.log(listeners[i].toString()); } process.exit(); });

Programa completo para la prueba:

process.on(''SIGINT'', function() { console.log(''Naughty SIGINT-handler''); }); process.on(''exit'', function () { console.log(''exit''); }); console.log(''PID: '', process.pid); var http = require(''http''); http.createServer(function (req, res) { res.writeHead(200, {''Content-Type'': ''text/plain''}); res.end(''Hello World/n''); }).listen(1337, ''127.0.0.1''); console.log(''Server running at http://127.0.0.1:1337/''); process.on(''SIGINT'', function() { console.log(''Nice SIGINT-handler''); var listeners = process.listeners(''SIGINT''); for (var i = 0; i < listeners.length; i++) { console.log(listeners[i].toString()); } process.exit(); });