
다음 명령으로 출력을 캡처했습니다.
strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/
좀 길어서 올렸어요여기. strace
예를 들어 다음 줄과 같은 기본 출력 형식을 이해합니다 .
1399 open("/lib/x86_64-linux-gnu/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3
의미:
1399
프로세스의 PID입니다open(const char *pathname, int flags);
특정 인수가 포함된 시스템 호출입니다(에서 가져옴man 2 open
).3
반환 값, 이 특별한 경우의 파일 설명자(에서 가져옴man 2 open
)
에 따르면이것실:
rsync
복사를 수행하기 위해 두 개의 프로세스/스레드를 생성하고 프로세스 사이에 하나의 스트림 데이터가 있고 수신 프로세스에서 대상 파일로의 또 다른 스트림 데이터가 있습니다.다음과 같은 것을 사용하면
strace -e trace=process,socketpair,open,read,write
일부 스레드가 생성되고, 이들 사이에 소켓 쌍이 생성되며, 입력 및 출력 파일을 여는 다른 스레드가 표시됩니다.
strace
프로세스 간 통신에 익숙하지 않은 경우에도 언급된 스레드의 명령문을 확인하고 내부적으로 어떤 일이 발생하는지 확인할 수 있도록 출력을 구문 분석할 수 있습니까 ? 저는 특히 프로세스/스레드 간 데이터 전달에 관심이 있습니다(process1에서 process2로 전달된 데이터의 양은 얼마입니까? process2는 수신된 데이터를 어디에 기록합니까?).
또한 로그에서 다음과 같은 줄을 본 적이 있지만 이를 올바르게 해석하는 방법을 모르겠습니다.
1399 <... close resumed> ) = 0
1400 <... dup2 resumed> ) = 0
답변1
-y
에 플래그를 사용하는 것이 좋습니다strace
. 그러면 파일 설명자 인수와 관련된 경로가 인쇄됩니다.-e
에 대한 한정자입니다trace
. 원하는 시스템 호출이 누락될 수 있습니다.
grep
나는 자격을 갖추지 않고 모든 시스템 호출과 신호를 출력하는 것이 더 낫다고 생각합니다. 그런 다음 아래 예와 같이 원하는 정보를 필터링하는 데 사용할 수 있습니다 .
grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log