servidor proyecto produccion poner nodejs node correr con como aplicacion activar node.js bash process child-process sigkill

node.js - proyecto - Eliminar un script bash no mata procesos secundarios



poner en produccion nodejs (3)

¿Tiene una salida 0 en su script?

Ejemplo:

#!/bin/bash ifconfig exit 0

He escrito un script de prueba que ejecuta otro script para iniciar el servidor para probar. Cuando las pruebas han finalizado, se envía un mensaje SIGKILL al proceso del servidor; sin embargo, al ejecutar nuevamente el script de prueba, el servidor arroja un error EADDRINUSE (estoy en un entorno node.js) que significa el puerto que el servidor está tratando de montar. está actualmente en uso. El proceso que intentamos matar con un SIGKILL todavía se está ejecutando. No creo que esto sea un problema específico de nodo, sino más bien una falta de educación sobre cómo funcionan los procesos bash.

Aquí hay algunos detalles, este es mi script de inicio llamado scripts/start-node.sh :

#!/bin/bash node_modules/.bin/babel-node --stage 0 index.js

Este es mi servidor de nodos llamado index.js (no he creado ningún detector de eventos de process ):

Http.createServer(…).listen(PORT, () => console.log(`Server listening on ${PORT}`))

Y el script de inicio se controla con el nodo child_process module:

var child = child_process.spawn(''scripts/start-node.sh'') // Later… child.kill(''SIGKILL'')


Para matar un proceso secundario y todos sus hijos, puede usar process.kill con un pid negativo (para matar a un grupo de procesos)

var child = child_process.spawn(''scripts/start-node.sh'', {detached: true}) // Later… process.kill(-child.pid, ''SIGKILL'');

Consulte los detalles sobre la documentación child_process para ver las child_process

En dispositivos que no son de Windows, si se establece la opción separada, el proceso secundario se convertirá en el líder de un nuevo grupo y sesión de proceso.

Haciendo referencia aquí, una porción del man 2 kill por algunos detalles:

Si pid es menor que -1, entonces sig se envía a cada proceso en el grupo de proceso cuya ID es -pid.

Otra opción puede ser usar trap en su script de shell para interceptar una señal y matar a todos los hijos y usar child.kill(''SIGTERM'') desde el node (ya que SIGKILL no será interceptado por trap )

#!/bin/bash trap ''kill $(jobs -p)'' EXIT node_modules/.bin/babel-node --stage 0 index.js


tener un controlador para las señales de proceso en su servidor

server.js

var http = require(''http''); function handleRequest(request, response){ response.end("Hello"); } var server = http.createServer(handleRequest); server.listen(3000, function(){console.log("listening...")}); process.title="testserver" process.on(''SIGQUIT'', function() { server.close() });

startup.sh

#!/bin/bash node server.js & echo "started"

y luego tener un "shutdown.sh".

shutdown.sh

#!/bin/bash pkill -QUIT testserver & echo "stoped"

Matará todos los procesos con ese nombre, en caso de que esté generando procesos multibles en su "start-node.sh". De esta forma, puede tener algún código de limpieza al apagar, por ejemplo, al cerrar todas las conexiones, etc.

y en tu corredor de prueba puedes hacer

var exec = require(''child_process'').exec; exec("./start.sh") // later... exec("./stop.sh")