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.sh
desde 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 recibo hordas de texto volando por la pantalla, es demasiado detallado. Puedo detenerme strace
y 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 screen
sesió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 write
Respuestas:
Si todo lo que quiere hacer es espiar el proceso existente, puede usar
strace -p1234 -s9999 -e write
donde 1234 es la ID del proceso. (-s9999
evita tener cadenas truncadas a 32 caracteres ywrite
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 comostrace -p1234 -e trace= -e write=3
ver 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
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á ejecutarsestrace
como 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_scome
sysctl.fuente
man strace
Puede acceder a la salida a través del
proc
sistema de archivos.1
= stdout,2
= stderrfuente
/dev/null
); solo funcionará si la salida se redirige a un archivo.ping google.es
y en otra como root:tail -f /proc/`pgrep ping`/fd/2
y no se muestra nada.En BSD, puede usar
watch
qué espías de un tty dado, por ejemploEn Linux, no será posible si el proceso no se ejecutó bajo multiplexor antes como
screen
otmux
. 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
pgrep
para 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 read
si hay más parámetros (por ejemplo,-n
para 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 -scale
dóndelocalhost
debe ser reemplazado por las credenciales de inicio de sesión de su servidor remoto y:0.0
con 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 reemplazarlas2
con 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 sertail
problemá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.rb
No olvides
chmod a+x /usr/bin/parse_strace.rb
Invoco
strace -xx
(genera hexadecimal, por lo que la expresión regular coincide correctamente), canalizando (incluido STDERR) a mi script con9
el 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