
次のコマンドを使用して出力をキャプチャしました。
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
コピーを実行するために2つのプロセス/スレッドを作成します。 1 つはプロセス間でデータをストリーミングし、もう 1 つは受信プロセスから宛先ファイルにデータをストリーミングします。このようなものを使用すると、
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