strace para solucionar problemas de comunicación entre procesos

strace para solucionar problemas de comunicación entre procesos

Tengo salida capturada por el siguiente comando:

strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/

es un poco largo así que lo he subidoaquí. Entiendo el formato básico de stracesalida, por ejemplo la siguiente línea:

1399 open("/lib/x86_64-linux-gnu/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3

Significa que:

  1. 1399es el PID del proceso
  2. open(const char *pathname, int flags);es una llamada al sistema con argumentos particulares (tomado de man 2 open)
  3. 3es el valor de retorno, un descriptor de archivo en este caso particular (tomado de man 2 open)

De acuerdo aestehilo:

rsyncgenera dos procesos/hilos para hacer la copia, y hay un flujo de datos entre los procesos y otro desde el proceso receptor al archivo de destino.

Usar algo así strace -e trace=process,socketpair,open,read,writemostraría algunos subprocesos generados, el par de sockets que se crea entre ellos y diferentes subprocesos que abren los archivos de entrada y salida.

¿Puedo de alguna manera analizar straceel resultado para poder confirmar las declaraciones del hilo mencionado y ver qué sucede bajo el capó, incluso si no estoy muy familiarizado con la comunicación entre procesos? Estoy especialmente interesado en el paso de datos entre procesos/hilos (¿cuántos datos se pasaron del proceso1 al proceso2? ¿Dónde escribió el proceso2 los datos recibidos?)

También he visto líneas como ésta en el registro pero no sé cómo interpretarlas correctamente:

1399  <... close resumed> )             = 0
1400  <... dup2 resumed> )              = 0

Respuesta1

  • Recomiendo usar -yflag for strace, imprimirá rutas asociadas con los argumentos del descriptor de archivo.

  • -ees calificador para trace, es posible que desee perder las llamadas al sistema.

Creo que es mejor generar todas las llamadas y señales del sistema sin calificar, luego puedes usarlas greppara filtrar la información que deseas, como se muestra a continuación:

grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log

información relacionada