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.