
Ich habe die Ausgabe mit folgendem Befehl erfasst:
strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/
es ist ein bisschen lang, deshalb habe ich es hochgeladenHier. Ich verstehe das grundlegende Ausgabeformat strace
, beispielsweise folgende Zeile:
1399 open("/lib/x86_64-linux-gnu/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3
Bedeutet, dass:
1399
ist die PID des Prozessesopen(const char *pathname, int flags);
ist ein Systemaufruf mit bestimmten Argumenten (entnommen ausman 2 open
)3
ist der Rückgabewert, in diesem speziellen Fall ein Dateideskriptor (entnommen ausman 2 open
)
EntsprechendDasFaden:
rsync
erzeugt zwei Prozesse/Threads zum Ausführen des Kopiervorgangs, und es gibt einen Datenstream zwischen den Prozessen und einen weiteren vom empfangenden Prozess zur Zieldatei.Die Verwendung von etwas wie
strace -e trace=process,socketpair,open,read,write
würde einige gestartete Threads, das zwischen ihnen erstellte Socket-Paar und verschiedene Threads zeigen, die die Eingabe- und Ausgabedateien öffnen.
Kann ich strace
die Ausgabe irgendwie analysieren, um Anweisungen aus dem genannten Thread bestätigen zu können und zu sehen, was im Hintergrund passiert, auch wenn ich mit der Kommunikation zwischen Prozessen nicht sehr vertraut bin? Mich interessiert insbesondere der Datenaustausch zwischen Prozessen/Threads (wie viele Daten wurden von Prozess1 an Prozess2 weitergegeben? Wohin hat Prozess2 die empfangenen Daten geschrieben?)
Ich habe im Protokoll auch Zeilen wie diese gesehen, weiß aber nicht, wie ich sie richtig interpretieren soll:
1399 <... close resumed> ) = 0
1400 <... dup2 resumed> ) = 0
Antwort1
-y
Ich empfehle, das Flag für zu verwendenstrace
. Es druckt die mit den Dateideskriptorargumenten verknüpften Pfade.-e
ist ein Qualifizierer fürtrace
, es können die gewünschten Systemaufrufe verpasst werden.
Ich denke, es ist besser, alle Systemaufrufe und Signale ohne Qualifizierung auszugeben, dann können Sie damit grep
die gewünschten Informationen filtern, Beispiel unten:
grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log