Estoy tratando de ejecutar un comando de shell desde Node.js, sin redireccionando la entrada y salida de ese comando - al igual que desgranar un comando usando un script de shell , o usando el comando system
de Ruby. Si el proceso hijo quiere escribir en STDOUT, quiero que vaya directamente a la consola (o que me redirijan, si la salida de mi aplicación Node fue redirigida).Ejecutando un comando de shell desde Node.js sin buffering salida
El nodo no parece tener ninguna forma directa de hacerlo. Parece que la única forma de ejecutar otro proceso es con child_process
, que siempre redirige la entrada y salida del proceso secundario a las tuberías. Puedo escribir código para aceptar datos de esos tubos y escribirlos en STDOUT y STDERR de mi proceso, pero si hago eso, las API me obligan a sacrificar algo de flexibilidad.
Quiero dos características:
- sintaxis Shell. Quiero poder canalizar la salida entre comandos o ejecutar archivos por lotes de Windows.
- Salida ilimitada. Si estoy desembolsando un compilador y quiere generar megabytes de advertencias de compilación, quiero que todos se desplacen por la pantalla (hasta que el usuario se sienta cansado y presione Ctrl + C).
Parece que Node quiere obligarme a elegir entre esas dos características.
- Si quiero una cantidad ilimitada de salida, puedo usar
child_process.spawn
y luego hacerchild.stdout.on('data', function(data) { process.stdout.write(data); });
y lo mismo parastderr
, y va a felizmente datos del tubo hasta que las vacas vuelvan a casa. Desafortunadamente,spawn
no es compatible con la sintaxis del shell. - Si quiero sintaxis de shell, puedo usar
child_process.exec
. Peroexec
insiste en almacenar temporalmente el STDOUT y el STDERR del proceso secundario y dándome todo al final, y limita el tamaño de esos almacenamientos intermedios (configurable, 200K de forma predeterminada). Todavía puedo conectar los eventoson('data')
, si deseo ver el resultado tal como se genera, peroexec
aún agregará los datos a sus búferes también. Cuando la cantidad de datos excede el tamaño del búfer predefinido,exec
finalizará el proceso hijo.
(También hay child_process.execFile
, que es el peor de ambos mundos desde un punto de vista flexibilidad:. Ningún sintaxis del shell, pero todavía tiene que limitar la cantidad de producción que espera)
Me estoy perdiendo ¿alguna cosa? ¿Hay alguna manera de simplemente pagar en un proceso hijo en Node, y no redirigir su entrada y salida? Algo que admite la sintaxis de la shell y no causa una cantidad predefinida de salida, tal como está disponible en los scripts de shell, Ruby, etc.
¿Alguna vez descubrió esto? Estoy en una situación similar. –
mismo problema, 'hasta que las vacas vuelvan a casa' gracias, por eso, hice mi día después de las 10h de trabajo – neric