¿Es posible leer la salida de cualquier proceso usando su PID?

32

¿Es posible conectar un terminal a un proceso que ya se está ejecutando usando su PID de manera similar a usar el fgcomando para trabajos?

Tommy
fuente
¡¿como que?! ¿Cuál es el proceso que quieres adjuntar?
Me gustaría poder ver la salida de un programa que se inició en otra terminal
Tommy

Respuestas:

43

Puede obtener los descriptores de archivo estándar de ese proceso, por ejemplo stdout:

tail -f /proc/<pid>/fd/1
Jorge Castro
fuente
8
Probé esta solución con top y no parece funcionar. En una terminal lancé top y en otra usé su comando con el pid corred pero no obtuve salida.
Tommy
1
¿Cómo se hace esto en una Mac?
Avner Barr
¿Qué pasa con stderr? Supongo que / proc / <pid> / fd / 2, pero ¿cómo se obtienen stdout / stderr?
Alexander Mills
1
¿Qué pasa si este descriptor apunta a un zócalo? Tail no puede leerlo. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar dice reinstalar a Mónica el
8

Hay algunas opciones aquí. Una es redirigir la salida del comando a un archivo, y luego usarla tailpara ver nuevas líneas que se agregan a ese archivo en tiempo real.

Otra opción es iniciar su programa dentro de screen, que es una especie de aplicación de terminal basada en texto. Las sesiones de pantalla se pueden adjuntar y desconectar, pero están destinadas nominalmente a ser utilizadas únicamente por el mismo usuario, por lo tanto, si desea compartirlas entre usuarios.

De lo contrario, si lo desea, puede rastrear el proceso y ver qué está haciendo con strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Adjunte al proceso con el ID de proceso PID y comience el rastreo.
  • -s SIZE: Especifique el tamaño máximo de cadena para imprimir (el valor predeterminado es 32).
  • -o filename: Escriba la salida de rastreo en el nombre del archivo en lugar de en la pantalla (stderr)
Olorin
fuente
Finalmente no parece funcionar. Lancé top y en otro usé su comando con el pid corred pero no obtuve el resultado esperado. Cuando uso la cola después.
Tommy
sudoDebe usar strace para adjuntar a un proceso, y usar -o ~/output.txtpara que el archivo quede en su carpeta de inicio.
Use el archivo de salida, ¡no lo envíe a la pantalla! No seas un idiota como yo, presiona Ctrl-C para salir de la escena y luego desconecté mi PID. Me asusté muchísimo con un guión importante.
Weston Ganger
3

Puede usar los siguientes comandos para adjuntar un proceso en ejecución en otro terminal:

Ejemplo:

screen -S PID
retty $(pgrep PID)
reptyr PID
devav2
fuente
No pude encontrar retty o reptry. Además, para poder usar la pantalla, debo iniciar el proceso original con ella para que no resuelva mi problema.
Tommy
puede instalarlo usando el comando, sudo apt-get install rettypero existen pocas limitaciones con retty. Consulte la página de manual mencionada en la respuesta.
devav2