我通过以下命令捕获了输出:
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
是进程的PIDopen(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
flag forstrace
,它将打印与文件描述符参数关联的路径。-e
是 的限定符trace
,它可能会错过您想要的系统调用。
我认为最好输出所有系统调用和信号而不进行限定,然后您可以使用它grep
来过滤您想要的信息,示例如下:
grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log