Actualmente estoy trabajando en un proyecto que requiere que el usuario haga clic en el botón 'ejecutar' para llamar a child_process en el backend para ejecutar una tarea que requiere mucho tiempo. Los códigos son los siguientes,
let child = child_process.spawn(//args); let data = ''; let err = ''; for await(const chunk of child.stdout) { data += chunk; } for await(const chunk of child.stderr) { err += chunk; } return {"out": data, "err": err};Aquí se omite la decodificación. La tarea de child_process generaría todos los resultados al final del proceso, por lo que no habría resultados mientras la tarea esté en curso.
Y la interfaz de usuario tiene un botón para que el usuario cancele la tarea mientras se está ejecutando. He intentado if (cancelFlag) {child.kill('SIGTERM')} justo después de child_process.spawn , pero no funcionó. ¿Supongo que se necesita un oyente para child_process?
Gran gracias por cualquier sugerencia.
Si está utilizando un sistema POSIX, enviar SIGTERM al niño debería eliminar el proceso de forma predeterminada.
Sin embargo, en Windows, SIGTERM solo está disponible para escuchar y no tiene un comportamiento predeterminado https://nodejs.org/api/process.html#signal-events .
Si está programando en Windows, debería poder agregar un oyente para la señal SIGTERM
child_process.spawn acepta la señal y killSignal en las opciones para cancelar el proceso killSignal es SIGTERM por defecto, y la solución descrita en las respuestas anteriores
Pero aquí hay un ejemplo con un controlador de señal y cancelación.
let abortController = new AbortController(); let child = ChildProcess.spawn("sleep", ["1"], { signal: abortController.signal, }); setTimeout(() => { abortController.abort(); }, 300);