다음 명령을 사용하여 출력을 캡처했습니다.
$ strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/
좀 길어서 올려봤습니다.여기. 이제 이 파일에 대한 몇 가지 분석을 수행하고 싶습니다.
다음 출력은 clone
시스템 호출을 사용하여 생성된 프로세스/스레드를 보여줍니다.
# SPAWNED PROCESSES/THREADS
$ grep 'clone(' rsync.log | awk '{print $1 " -> " $NF}'
1399 -> 1400
1400 -> 1401
다음 출력은 대부분의 경우 데이터가 write
숫자가 있는 파일 설명자에 대해 n임을 보여줍니다 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
다음 출력은 4
설명자가 open
시스템 호출을 사용하여 열리지 않았음을 보여줍니다(1은 STDOUT이므로 이 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
두 가지 질문:
I. 4
설명자가 편집되지 않은 경우 이 데이터는 어디로 이동하며 예상대로 작동하려면 open
어떻게 해야 합니까 ? rsync
:
$ grep 'write(4' rsync.log | head
1399 write(4, "\37\0\0\0", 4 <unfinished ...>
1399 write(4, "I\0\0\7\5(\1.\0\0\0W}%i\360\220\261\177\21\370A\0\0\0\203\347\6vbox"..., 77 <unfinished ...>
1401 write(4, "\4\0\0\7\376\377\377\377", 8) = 8
1399 write(4, "\177\301\0\7\3\n\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\177\377\354\226C\214.\0\260"..., 49539) = 49539
1399 write(4, "\2\301\0\7\177\377a\353\35\2433\1\332m\301\330\266\315\216\3557\352\330\266m\333\366\33\333\266;v"..., 49414) = 49414
1399 write(4, "\21\302\0\7\177\377\236mTNG\356\304\376u\237\214\275\310\300*\317\264\221W\372\340\307\36\345%\330"..., 49685 <unfinished ...>
1399 write(4, "\360\300\0\7\177\377\27W\357\24$\f\23,\v\216\355\371\306\266m\333\266m\333\266m\333\266m\333\266"..., 49396 <unfinished ...>
1399 write(4, "\223\301\0\7\177\377D\214# D\304\2\25xA\fY\310U\201Q*e\25\235\20\213\v\320~\331"..., 49559 <unfinished ...>
1399 write(4, "\370\300\0\7\177\377l\275cs.\0\27$\30\334\330\266}c\333\266m\333\266\235<\261m\333\266m"..., 49404 <unfinished ...>
1399 write(4, "\20\301\0\7\177\377\25\255\252Q\223\340\244w3\247\252\322Z\235\310\2424g\330\274\354\3150\237B\26"..., 49428) = 49428
2. 프로세스 간에 전송되는 데이터(해당 행)를 어떻게든 얻을 1399
수 1400
있습니까 ?1399
1401
감사해요
답변1
한 번도 열리지 않은 파일 설명자에 기록된 데이터는 아무데도 가지 않습니다. (잘못된 파일 설명자) 로 인해 시스템 write
호출이 실패합니다 .EBADF
그러나 ~함에 따라음 댓글을 달았습니다., open
파일을 여는 유일한 방법은 아닙니다. 또한 pipe
한 쌍의 파이프 끝을 만들고, socketpair
서로 통신하는 한 쌍의 소켓을 만들고, 원격 주소와 통신하는 소켓을 만드는 등의 작업을 할 수 있습니다 . ( 예: socket
액세스 accept
할 수 없는 파일 형식은 말할 것도 없습니다.) write
디렉토리, inotify 이벤트 큐 등)