2012-08-01 16 views
8

no lo cierre como duplicado, ya que tengo un cambio sutil pero significativa de las preguntas similiar:Captura de salida de proceso externo

¿Es posible capturar la salida de un proceso externo (es decir, la salida estándar) en Java, cuando no creé el proceso, y todo lo que sé es el nombre del proceso?

estoy corriendo en Windows 7.

EDIT:

Si hay una manera de hacerlo en otro idioma (C# \ C++), entonces puedo escribir un programa "CaptureOutput" que captura la salida, escribe en stdout y en mi código java para iniciar "CaptureOutput" y leer su stdput.

Feo, pero podría funcionar.

Así que responder en otros idiomas también está bien conmigo.

+0

¿Lo está ejecutando en Unix? – amicngh

+0

@amicngh Me estoy ejecutando en Windows 7 – sara

+0

tiene acceso a otro proceso para desencadenar desde cualquier lugar como java – amicngh

Respuesta

0

¿Tiene algún control sobre cuándo comienza el proceso? Si es así, podría iniciar el proceso y hacer que su tubería se extienda a un archivo que pueda leerse o a otro programa que escriba y pueda registrarlo en una base de datos, visualizador de eventos, etc.

+0

No, no tengo control. Como dije: No creé el proceso. – sara

+0

¿Podría compilar este otro proceso? – RichardJohnn

+0

No :(, lo compilo .... – sara

1

Primero déjeme decir que estás pidiendo que rompa todas las reglas del aislamiento del proceso. Si su proceso no crea el proceso cuyo resultado desea capturar, y tampoco tiene acceso para modificar el proceso de llamada (command shell? Service manager? No ha dicho cuál). Entonces, su única posibilidad, y es delgada en el mejor de los casos, es inyectar un hilo en el proceso y, mientras todos sus otros hilos están suspendidos, alterar el stdout global (¿y el stderr?). Esto solo puede hacerse mediante un proceso con privilegios de acceso total al proceso objetivo. Realizar dicha cirugía en un proceso de ejecución no es para los débiles de corazón.

+0

Otra alternativa extrema sería extraer toda la información de tiempo de ejecución que pueda sobre el proceso, matar el original y comenzar su propia copia con la redirección que desee. Eso probablemente sería frunció el ceño aunque ... –

+0

Referencias adicionales esperan al querant ansioso/desesperado. –

+0

Una combinación de SetStdHandle y Three-Ways-to-Inject-Your-Code-into-Another-Process en codeproject puede llevarte allí. Debo recalcar que "podría llevarte allí". Lo siento pero tengo que decir que esto es solo una mala idea. Encuentre una solución de archivo de registro o hable con los desarrolladores del programa o el administrador del sistema o algo así. –

0

En Linux, compruebe los mecanismos de IPC del sistema operativo, como las colas de mensajes, las tuberías, la memoria compartida y los sockets. Estos mecanismos permiten Inter-process communication. Aunque, si está particularmente interesado en la salida de un programa, una solución alternativa podría ser que el primer proceso envíe los datos al disco en un archivo y los lea con un proceso separado. De esta forma, puede usar múltiples idiomas para la tarea. Un ejemplo simple sería hacer que C++ escriba algunos datos en un archivo, y usar JAVA leer/usar los datos, dado el mismo archivo. Espero estar cerca de responder, si es que lo hago.

1

Lo que estás tratando de hacer es bastante peligroso. Sería muy fácil corromper accidentalmente la memoria del proceso al que intenta ingresar. Prueba, prueba, prueba. Luego prueba algunos más. Y buena suerte, sé que no me gustaría tener que hacer esto.

Este artículo - API Hooking - explica cómo comenzar con lo que desea (usando C++). Una vez que haya insertado su código en un proceso en ejecución, hay otras llamadas a API de Windows para reemplazar STDOUT (por ejemplo, SetStdHandle).

Cuestiones relacionadas