2011-08-24 26 views
7

Estoy tratando de ejecutar un child_process de forma síncrona en node.js (Sí, sé que esto es malo, tengo una buena razón) y recupero cualquier salida en stdout, pero No puedo entender cómo ...node.js - ejecute el comando de forma sincrónica y obtenga el resultado

Encontré esta publicación SO: node.js execute system command synchronously que describe cómo usar una biblioteca (node-ffi) para ejecutar el comando, y esto funciona muy bien, pero lo único que hago es ' m capaz de obtener es el código de salida del proceso. Cualquier información que ejecute el comando se envía directamente a stdout, ¿cómo puedo capturar esto?

> run('whoami') 
username 
0 

en otras palabras, username se echo'd a stdout, el resultado de run es 0.

que había mucho en lugar de encontrar la manera de leer la salida estándar

+0

Intenta mirar [aquí] [1]. Es discusión de la misma pregunta. [1]: http://stackoverflow.com/questions/4443597/node-js-execute-system-command-synchronously/8625316#8625316 – scherka

Respuesta

2

Así que tengo una solución de trabajo, pero no exactamente igual ... Sólo publicar aquí para referencia:

Estoy usando la biblioteca node-ffi a la que se hace referencia en la otra publicación SO. Tengo una función que:

  • toma en una orden dada
  • anexa >> run-sync-output
  • lo ejecuta
  • lee run-sync-output forma sincrónica y almacena el resultado
  • elimina este archivo tmp
  • devuelve un resultado

Hay un n problema obvio donde si el usuario no tiene acceso de escritura al directorio actual, fallará. Además, es solo un esfuerzo desperdiciado. : -/

-2

Aparte del código de escritura un poco diferente, en realidad no hay razón para hacer nada sincronizado.

¿Qué no te gusta de esto? (docs)

var exec = require('child_process').exec; 

exec('whoami', function (error, username) { 
    console.log('stdout: %s', username); 
    continueWithYourCode(); 
}); 
+0

En realidad no hay en este caso. Tengo una biblioteca conectada a 'stylus' que compila sprites CSS a partir de imágenes individuales. Como 'stylus' se escribe sincrónicamente, cualquier gancho tiene que estar sincronizado también. No voy a volver a escribir el motor de análisis completo, e incluso si lo hiciera, probablemente no sería aceptado en la rama principal y mi biblioteca externa solo funcionaría fuera de mi sucursal. –

+5

-1 "no hay motivo ..." y ¿cómo puede saberlo? Odio estos argumentos inútiles que nunca se pueden probar como correctos y, de hecho, te equivocas, hay varios casos en los que es obligatorio o de ayuda hacer cosas de forma sincrónica. – Tower

+0

@rFactor: en realidad no hay razón. Puedes decir que es más fácil para ti acertar el código sincronizado porque estás acostumbrado pero en realidad no hay razón. – dresende

1

he construido un módulo de Node.js que resuelve este problema exacto. Compruébelo usted mismo :)

exec-plan

actualización

El módulo anterior resuelve el problema original, ya que permite el encadenamiento síncrona de procesos hijo. Cada eslabón de la cadena obtiene la salida estándar del proceso previo de la cadena.

+0

¿Qué método (s) en este módulo se puede utilizar para obtener el resultado de un comando? –

+0

La intención del módulo es configurar una cadena de comandos como un plan, y stdout/err estará disponible para la función "preLogic" del comando "siguiente" en el plan. Entonces, por ejemplo: si tuviera execPlan.add ('ps -ef'); Luego, en su próximo "agregar", puede usar una función "pre lógica" como primer parámetro para usar la salida de 'ps -ef'. Por ejemplo: execPlan.add (function (stdout) {// hace algo con stdout de 'ps -ef' que se ejecuta antes de 'grep ls'}, 'grep ls') ;. Si este comentario no aclara muy bien, ¿podría publicar en el sitio github del módulo en sí? Además, revise el archivo README.md :) – Ryan

+0

¿Es posible devolver el resultado de la línea de comandos como una cadena usando este módulo (en lugar de solo imprimirlo usando console.log?) –

1

Tuve un problema similar y terminé escribiendo una extensión de nodo para esto. Puedes ver el repositorio de git. ¡Es de código abierto y gratuito y todas esas cosas buenas!

https://github.com/aponxi/npm-execxi

ExecXI es una extensión nodo escrito en C++ para ejecutar shell comandos uno por uno, la salida de la salida del comando a la consola en en tiempo real. Hay formas encadenadas y desencadenadas opcionales; significando que puede elegir detener la secuencia de comandos después de que falla un comando (encadenado), o puede continuar como si nada hubiera sucedido.

Las instrucciones de uso están en el ReadMe file. Siéntase libre de hacer solicitudes de extracción o enviar problemas!

Sin embargo, no devuelve el stdout todavía ... Bueno, acabo de lanzarlo hoy. Tal vez podamos construir sobre eso.

De todos modos, pensé que valía la pena mencionarlo. También publiqué esto en una pregunta similar: node.js execute system command synchronously

Cuestiones relacionadas