He dejado una secuencia de comandos ejecutándose en una máquina remota desde que estaba trabajando localmente en ella. Puedo conectarme a través de SSH a la máquina como el mismo usuario y ver el script ejecutándose 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.shdesde una ventana de terminal local, sin redirección, sin uso de screenetc.).
¿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 18386pero recibo hordas de texto volando por la pantalla, es demasiado detallado. Puedo detenerme stracey luego examinar la salida y encontrar el texto impreso en stdout, pero es muy largo y confuso, y obviamente mientras está detenido podría perder algo. Me gustaría encontrar una manera de ver la salida del script en vivo como si estuviera trabajando localmente.
¿Alguien puede mejorar en esto? La respuesta obvia es reiniciar el script con redireccionamiento o en una screensesión, etc., este no es un script de misión crítica, por lo que podría hacer eso. Sin embargo, veo esto como un ejercicio de aprendizaje divertido.
fuente

strace -p 4232 -e writeRespuestas:
Si todo lo que quiere hacer es espiar el proceso existente, puede usar
strace -p1234 -s9999 -e writedonde 1234 es la ID del proceso. (-s9999evita tener cadenas truncadas a 32 caracteres ywritela llamada al sistema que produce la salida). Si desea ver solo los datos escritos en un descriptor de archivo en particular, puede usar algo comostrace -p1234 -e trace= -e write=3ver solo los datos escritos en el descriptor de archivo 3 (-e trace=impide que el sistema llamadas de ser robado). Eso no le dará salida que ya ha sido producida.Si el resultado se desplaza demasiado rápido, puede canalizarlo a un localizador como
less, o enviarlo a un archivo constrace -o trace.log ….Con muchos programas, puede desviar la salida posterior con un hack de ptrace, 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
stracecomandos 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á ejecutarsestracecomo root). La mayoría de las distribuciones solo permiten que un proceso rastree a sus hijos (esto proporciona un beneficio de seguridad moderado: evita la inyección directa de malware, pero no evita la inyección indirecta modificando archivos). Esto es controlado por elkernel.yama.ptrace_scomesysctl.fuente
man stracePuede acceder a la salida a través del
procsistema de archivos.1= stdout,2= stderrfuente
/dev/null); solo funcionará si la salida se redirige a un archivo.ping google.esy en otra como root:tail -f /proc/`pgrep ping`/fd/2y no se muestra nada.En BSD, puede usar
watchqué espías de un tty dado, por ejemploEn Linux, no será posible si el proceso no se ejecutó bajo multiplexor antes como
screenotmux. Ver también: Reptyr: Adjuntar un proceso en ejecución a una nueva terminalParece que la única manera de hacerlo es depurar el proceso (por ejemplo
strace,dtrace/dtruss,gdb,lldb, etc.).Como ha utilizado
strace, para obtener cualquier resultado significativo, debe filtrar por una expresión calificada (comofile), luego analizar el resultado. Aquí hay un ejemplo:Lo que hace imprime la operación de escritura del proceso (longitud 1000) especificada por PID (se usa
pgreppara buscarlo por nombre), redirige el error estándar a la salida (para filtrar) e imprime una cadena entre comillas dobles.Si se trata de una salida binaria, puede analizar caracteres de secuencias de escape utilizando
read(con-r) yprintf(con%b), p. Ej.Verifique
help readsi hay más parámetros (por ejemplo,-npara imprimir después de cierta cantidad de caracteres, en lugar de una nueva línea).Aquí hay un ejemplo más completo:
Para ver ejemplos de cualquier proceso, consulte: ¿Cómo analizar strace en shell en texto plano? en stackoverflow
fuente
Es posible que pueda echar un vistazo a la pantalla remota utilizando
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scaledóndelocalhostdebe ser reemplazado por las credenciales de inicio de sesión de su servidor remoto y:0.0con el número de pantalla de su GUI.Use
x11vnc, que es un servidor VNC para su sesión X en pantalla.Cuando se ejecute en una de las 6 consolas virtuales
sudo setterm -dump 2 -file /dev/stdout, intente reemplazarlas2con la vc adecuada.fuente
Aconsejaría hacer una tubería con nombre (
mkfifo) y luego escribir en ese archivo. Entonces, lea de ella. Siempre puede hacer eso con cosas comotail, para minimizar la salida, etc. Cada vez que limpia la tubería (leída de ella), se borra, por lo que la salida no se conserva.La otra opción sería escribir todo en un archivo (como un archivo de registro) y luego analizarlo en cualquier momento. Esta sería la acción preferida, si desea conservar toda la salida.
fuente
Siempre puede iniciar un proceso con nohup y &
Luego, podrá verificar el progreso desde cualquier tty con:
Esto me funciona bien.
fuente
Una forma muy simple de obtener la salida sería capturar su salida en un archivo y seguir ese archivo.
SI LO HACE: ./ipcheck
INSTEAD DO: ./ipcheck> [replacewithyourfilename]
Esto crearía un archivo de salida donde se encuentra su script. Luego, desde cualquier otro shell bash, simplemente puede seguir el archivo:
cola [reemplazar con su nombre de archivo] -f
fuente
setbuf(3)), lo que puede sertailproblemático.Analizando la salida de strace:
Usé la respuesta principal (con mi ID de proceso de 28223) ...
Para determinar que me importa
write(9. (El 9 se usa a continuación, probablemente sea un identificador de archivo y puede ser diferente para su proceso). Luego escribí un script rápido de Ruby para analizarlo y mostrarlo.Pegue lo siguiente en
/usr/bin/parse_strace.rbNo olvides
chmod a+x /usr/bin/parse_strace.rbInvoco
strace -xx(genera hexadecimal, por lo que la expresión regular coincide correctamente), canalizando (incluido STDERR) a mi script con9el primer argumento.Y, ¡voila, genera el STDOUT original del proceso, las nuevas líneas, el color y todo!
fuente
¿No puede obtener la ID del proceso y comunicarse con USR1?
que imprime el PID de su script, luego lo usa para
Entiendo que USR1 es una señal "definida por el usuario", lo que significa que quien creó el programa puede usarlo para significar "apagar" o "volcar sus registros" o "imprimir miles de veces" o lo que sea.
fuente