GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo ver la salida de un proceso en ejecución en otra sesión de Bash?

Dejé un script ejecutándose en una máquina remota desde que estaba trabajando localmente en él. Puedo conectarme a través de SSH a la máquina como el mismo usuario y ver el script ejecutándose en ps .

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

Simplemente está enviando a stdout en una sesión local (ejecuté ./ipchecker.sh formar una ventana de terminal local, sin redirección, sin uso de screen etc.).

¿Hay alguna forma de que desde una sesión SSH pueda ver el resultado de este comando en ejecución (sin detenerlo)?

Hasta ahora, lo mejor que he encontrado es usar strace -p 18386 pero tengo hordas de texto volando por la pantalla, es demasiado detallado. Puedo detener strace y luego revise la salida y encuentre el texto impreso en la salida estándar, pero es muy largo y confuso, y obviamente, mientras está detenido, podría perderme algo. Me gustaría encontrar una manera de ver la salida del script en vivo como si estuviera trabajando localmente.

¿Alguien puede mejorar esto? La respuesta obvia es reiniciar el script con redirección o en una screen sesión, etc., este no es un guión de misión crítica, así que podría hacerlo. Sin embargo, veo esto como un ejercicio de aprendizaje divertido.

Respuesta aceptada:

Si todo lo que quiere hacer es espiar el proceso existente, puede usar strace -p1234 -s9999 -e write donde 1234 es el ID del proceso. (-s9999 evita que las cadenas se trunquen a 32 caracteres y write la llamada al sistema que produce la salida). Si desea ver solo los datos escritos en un descriptor de archivo en particular, puede usar algo como strace -p1234 -e trace= -e write=3 para ver solo los datos escritos en el descriptor de archivo 3 (-e trace= impide que se registren las llamadas al sistema). Eso no le dará una salida que ya se ha producido.

Si la salida se desplaza demasiado rápido, puede canalizarla a un buscapersonas como less , o envíelo a un archivo con strace -o trace.log … .

Con muchos programas, puede desviar la salida posterior con un ptrace hack, ya sea a su terminal actual o a una nueva sesión de pantalla. Consulte ¿Cómo puedo rechazar un proceso en ejecución y asociarlo a un nuevo shell de pantalla? y otros hilos vinculados.

Tenga en cuenta que dependiendo de cómo esté configurado su sistema, es posible que deba ejecutar todos estos strace comandos como root incluso si el proceso se ejecuta bajo su usuario sin privilegios adicionales. (Si el proceso se ejecuta como un usuario diferente o es setuid o setgid, deberá ejecutar strace como raíz). La mayoría de las distribuciones solo permiten que un proceso rastree a sus elementos secundarios (esto proporciona un beneficio de seguridad moderado:evita la inyección directa de malware, pero no evita la inyección indirecta mediante la modificación de archivos). Esto está controlado por kernel.yama.ptrace_scome sist.

Relacionado:Cómo ganar el juego de operaciones en la nube con la automatización de Kubernetes y reducir costos en el proceso
Linux
  1. ¿Cómo cambiar la redirección de salida de un proceso en ejecución?

  2. Cómo redirigir la salida de un proceso que ya se está ejecutando

  3. ¿Cómo obtener solo todos los ID de proceso en ejecución?

  4. ¿Cómo puedo obtener la hora del reloj de pared de un proceso en ejecución?

  5. Cómo recuperar mediante programación el GID de un proceso en ejecución

Cómo usar el comando de lectura Bash

Cómo enumerar los procesos en ejecución en Linux

Reptyr:mueva un proceso en ejecución de una terminal a otra sin cerrarlo

¿Cómo aumento el búfer de desplazamiento hacia atrás en una sesión de pantalla en ejecución?

¿Cómo puedo crear un archivo de volcado de un proceso en ejecución en Linux?

¿Cómo desconectar la sesión ssh sin matar un proceso en ejecución?