
Я захватил вывод с помощью следующей команды:
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
вывод, чтобы иметь возможность подтвердить утверждения из упомянутого потока и увидеть, что происходит под капотом, даже если я не очень хорошо знаком с межпроцессным взаимодействием? Меня особенно интересует передача данных между процессами/потоками (сколько данных было передано от процесса 1 к процессу 2? куда процесс 2 записал полученные данные?)
Я также видел в журнале такие строки, но не знаю, как их правильно интерпретировать:
1399 <... close resumed> ) = 0
1400 <... dup2 resumed> ) = 0
решение1
Я рекомендую использовать
-y
флаг forstrace
, он выведет пути, связанные с аргументами дескриптора файла.-e
является квалификатором дляtrace
, возможно, вам нужны пропущенные системные вызовы.
Я думаю, что лучше выводить все системные вызовы и сигналы без квалификации, а затем можно использовать их grep
для фильтрации нужной информации, пример ниже:
grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log