Eu tenho a saída capturada pelo seguinte comando:
$ strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/
é um pouco longo, então eu carreguei aqui . Agora quero fazer algumas análises neste arquivo.
A seguinte saída mostra processos / threads gerados usando clone
syscall:
# SPAWNED PROCESSES/THREADS
$ grep 'clone(' rsync.log | awk '{print $1 " -> " $NF}'
1399 -> 1400
1400 -> 1401
A seguinte saída mostra que na maioria das vezes os dados foram write
n para o descritor de arquivos com o número 4
:
# PID, FD, NO OF CALLING WRITE SYSCALL
$ cat <(grep 'write(' rsync.log | egrep -v 'unfinished|resumed') <(paste <(grep write rsync.log | grep unfinished) <(grep write rsync.log | grep resumed)) | cut -d',' -f1 | sed 's%write(%%' | awk '{a[$0]++}END{print "PID FD COUNT"; for(i in a){print i " " a[i]}}'
PID FD COUNT
1399 4 1622
1400 1 7
1401 3 307
1401 4 7
1399 1 15
A seguinte saída mostra que o descritor 4
nunca foi aberto usando open
syscall (1 é STDOUT, portanto, não presumo de abrir este FD):
# LIST OF FILE DESCRIPTORS THAT WAS OPEN
$ grep 'open(' rsync.log | awk 'BEGIN {FS=" = "} {print $NF}' | grep '^[0-9]\+$' | sort | uniq
0
3
6
Duas perguntas:
eu. Se 4
descriptor não foi open
ed onde esses dados vão, e como é possível que rsync
funcionou como esperado?:
$ grep 'write(4' rsync.log | head
1399 write(4, "$ strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/
# SPAWNED PROCESSES/THREADS
$ grep 'clone(' rsync.log | awk '{print $1 " -> " $NF}'
1399 -> 1400
1400 -> 1401
# PID, FD, NO OF CALLING WRITE SYSCALL
$ cat <(grep 'write(' rsync.log | egrep -v 'unfinished|resumed') <(paste <(grep write rsync.log | grep unfinished) <(grep write rsync.log | grep resumed)) | cut -d',' -f1 | sed 's%write(%%' | awk '{a[$0]++}END{print "PID FD COUNT"; for(i in a){print i " " a[i]}}'
PID FD COUNT
1399 4 1622
1400 1 7
1401 3 307
1401 4 7
1399 1 15
", 4 <unfinished ...>
1399 write(4, "I# LIST OF FILE DESCRIPTORS THAT WAS OPEN
$ grep 'open(' rsync.log | awk 'BEGIN {FS=" = "} {print $NF}' | grep '^[0-9]\+$' | sort | uniq
0
3
6
$ grep 'write(4' rsync.log | head
1399 write(4, "%pre%%pre%%pre%", 4 <unfinished ...>
1399 write(4, "I%pre%%pre%(.%pre%%pre%%pre%W}%i00170A%pre%%pre%%pre%37vbox"..., 77 <unfinished ...>
1401 write(4, "%pre%%pre%6777", 8) = 8
1399 write(4, "71%pre%\n0%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%7746C4.%pre%0"..., 49539) = 49539
1399 write(4, "1%pre%77a3332m1065657206m3636;v"..., 49414) = 49414
1399 write(4, "2%pre%776mTNG646u74500*741W2075%0"..., 49685 <unfinished ...>
1399 write(4, "00%pre%77W7$\f,\v65166m36m36m36m36"..., 49396 <unfinished ...>
1399 write(4, "31%pre%77D4# D4xA\fY0U1Q*e53\v0~1"..., 49559 <unfinished ...>
1399 write(4, "00%pre%77l5cs.%pre%$406}c36m365<1m36m"..., 49404 <unfinished ...>
1399 write(4, "1%pre%7752Q304w3722Z5024g044507B"..., 49428) = 49428
(.%pre%%pre%%pre%W}%i00170A%pre%%pre%%pre%37vbox"..., 77 <unfinished ...>
1401 write(4, "%pre%%pre%6777", 8) = 8
1399 write(4, "71%pre%\n0%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%7746C4.%pre%0"..., 49539) = 49539
1399 write(4, "1%pre%77a3332m1065657206m3636;v"..., 49414) = 49414
1399 write(4, "2%pre%776mTNG646u74500*741W2075%0"..., 49685 <unfinished ...>
1399 write(4, "00%pre%77W7$\f,\v65166m36m36m36m36"..., 49396 <unfinished ...>
1399 write(4, "31%pre%77D4# D4xA\fY0U1Q*e53\v0~1"..., 49559 <unfinished ...>
1399 write(4, "00%pre%77l5cs.%pre%$406}c36m365<1m36m"..., 49404 <unfinished ...>
1399 write(4, "1%pre%7752Q304w3722Z5024g044507B"..., 49428) = 49428
II. Posso de alguma forma obter também dados (linhas correspondentes) que foram transferidos entre processos, por exemplo: de 1399
para 1400
ou de 1399
para 1401
etc. (se houver algum)?
Obrigado