es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forzar la finalización de un subproceso con un script de shell muy extenso.

Tengo un script de shell de ffmpeg grande de 80.000 caracteres y otro más pequeño.

Lo estoy ejecutando con execa y obtengo un PID.

execa(`chmod +x command.sh; chmod +x command2.sh; ./command.sh & ./command2.sh`, {shell: true, detached: true}

Después de salir de una pestaña, ejecuto exec(kill -9 ${pid}) en ese subprocess. Y tarda como 3-4 minutos en cerrarlo. ¿Cómo puedo optimizar esto? ¿Puedo matarlo al instante? Durante esos 3-4 minutos que intenta cerrarse, consume mucha potencia de CPU.

Información adicional

Entonces tengo 2 scripts de shell.

Uno para la transmisión de audio y otro para la transmisión de video.

Estoy usando & para ejecutarlos al mismo tiempo, porque necesito tanto el audio como el video al mismo tiempo al reproducir un video.

audioStream.sh es solo un comando de ffmpeg que genera fragmentos de audio hls.

videoStream.sh contiene 400 comandos de ImageMagick que convierten imágenes con borde y 85 comandos de ffmpeg que generan fragmentos de video hls que se agregan a la lista de reproducción maestra m3u8 que va al reproductor de video. Los comandos están delimitados con ';'.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en node.js, UNIX y subprocess, hay algunas optimizaciones que se pueden hacer para finalizar instantáneamente el subprocess en lugar de esperar de 3 a 4 minutos. Una posible optimización es enviar primero una señal SIGTERM para permitir que el proceso termine de manera adecuada antes de intentar finalizarlo forzosamente con SIGKILL (-9).

    Para hacer esto, puedes utilizar el módulo child_process en Node.js para crear los dos scripts de shell como procesos secundarios y hacer un seguimiento de sus PID. Luego, cuando quieras finalizar los procesos, puedes utilizar el método process.kill() con el PID y el argumento de señal establecido en “SIGTERM”. Esto permitirá que el proceso limpie cualquier recurso y salga de manera adecuada.

    Si el proceso no se termina dentro de cierto período de tiempo, entonces puedes utilizar nuevamente el método process.kill() con el mismo PID pero con el argumento de señal establecido en “SIGKILL”. Esto finalizará forzosamente el proceso si no salió adecuadamente después de recibir la señal SIGTERM.

    Otra optimización es refactorizar los scripts de shell para hacerlos más eficientes y menos intensivos en CPU. Por ejemplo, en lugar de utilizar 400 comandos de ImageMagick para convertir imágenes con borde, puedes utilizar un bucle para iterar a través de las imágenes y aplicar el mismo borde a todas ellas a la vez. Esto puede reducir significativamente el número de comandos y la carga en la CPU.

    De manera similar, puedes optimizar los comandos de ffmpeg para reducir el número de procesos y mejorar el rendimiento. Por ejemplo, puedes intentar utilizar la opción -map para especificar qué flujos incluir o excluir en lugar de utilizar múltiples comandos.

    En general, optimizar los scripts de shell y utilizar las señales adecuadas para finalizar los procesos secundarios puede ayudar a mejorar el rendimiento y reducir la carga en la CPU.

Comments are closed.