2012-01-28 11 views
8

Gracias! Mi usercase: comencé un largo proceso interactivo de 'configuración' (digamos en 'pantalla'), y luego me di cuenta de que siempre tengo que responder 'no' hasta que vea una palabra clave en particular. Parece una pérdida de tiempo para hacer esto a mano (por no decir que fácilmente puedo perder la palabra clave ...)Capture STDIN/STDERR/STDOUT de un proceso DESPUÉS de que se haya iniciado, utilizando la línea de comando?

Parece que quiero conectar (una copia de) STDERR/STDOUT a un filtro, y también ser capaz de inyectar en la STDIN de un proceso (consola), DESPUÉS de que se haya iniciado, usando la línea de comando? ¿Hay una solución preparada?

Las siguientes herramientas parecen útiles. Para capturar la salida, utilice

strace -ewrite -p $PID 

No es que limpia (muestra líneas como: escribir (#,)), pero funciona! ¿Pero dice que maneja UTF8 correctamente?

Para redirigir la salida, hacer algo como

printf '..input..' >/dev/pts/33 

Pero no está claro cómo encontrar el dispositivo correcto ..

+0

Debe agregar su resolución como respuesta y aceptarla. – Daenyth

Respuesta

6

resuelve en Linux (aparentemente específica de Linux):

reptyr -s PID 

adjunta un proceso a otro terminal y/o expone su entrada y salida como tuberías.

1

¿Por qué quieres hacer eso ??

¡No es posible de una manera portátil Posix-ly! Tal vez open -el /proc/1234/fd/0 y /proc/1234/fd/1 y /proc/1234/fd/3 pseudo-archivos (para el proceso 1234) podría ser una posibilidad fea. E incluso eso podría no funcionar en algunos casos (por ejemplo, para tuberías).

En particular, creo que la semántica de SIGPIPE enviados al proceso si nadie está leyendo una tubería se rompería ...

Y no creo que sería capaz de mantener el pseudo- tty calidad de, por ejemplo stdout.

Así que, básicamente, será mejor que encuentre una manera diferente de lograr sus objetivos generales, que no explicó explícitamente.

Si su caso de uso es una secuencia de comandos extraña configure, puede reiniciarlo y alimentarlo con algún script propio (en shell, python, perl, etc ...). No pierda tiempo para tratar de atrapar un proceso existente configure, simplemente reinícielo adecuadamente.

Ver también el comando screen (y cómo se implementa!)

+0

Gracias! Mi usercase: comencé un largo proceso interactivo de 'configuración' (digamos en 'pantalla'), y luego me di cuenta de que tenía que responder 'no' –

+0

¡Gracias! Mi usercase: comencé un largo proceso interactivo de 'configuración' (digamos en 'pantalla'), y luego me di cuenta de que siempre tengo que responder 'no' hasta que vea una palabra clave en particular. Parece una pérdida de tiempo para hacer esto a mano (por no decir que puedo perder fácilmente la palabra clave ...) –

+0

¡Gracias de nuevo! Mi punto es que sería muy útil a veces poder hacer esto, con cualquier proceso; 'configure' es solo un ejemplo ... 'screen' puede hacer algo como eso, pero no del todo: puede filtrar (: exec! .. | less) ya sea entrada o salida, pero no ambas cosas. Parece que tengo que escribir mi propio guión, entonces ... –

3

Esto es posible, pero no es bastante.El proceso es el siguiente:

  1. uso gdb para insertarse en el proceso ya se está ejecutando
  2. plazo p close(<fd>) donde <fd> es el descriptor de archivo que desea cambiar
  3. plazo p creat("<path to file">, <perms>) para enviar la salida de la fd cerrado alguna parte otra cosa

Ver This Link para obtener información más detallada

+4

En lugar de 'close()' en la fd, es posible que desee crear la nueva fd primero ('creat()', 'open()', etc.) luego use 'dup2()' para reemplazar la fd que desea capture, y luego 'close()' el nuevo fd. La razón es que 'open()' etc. siempre dará la fd más baja disponible, por lo que si cierra una fd y la abre justo después, no hay garantía de que obtendrá la misma fd. Tal vez no sea tan importante para stdin/stdout/stderr porque son fd 0,1,2, pero vale la pena mencionar para el caso general. – FatalError

+0

@FatalError +1 a su comentario, buena información general para tener – SiegeX

+0

pequeño programa de reptyr -s PID hace precisamente eso –

Cuestiones relacionadas