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")