strace를 사용하여 파일 생성을 캡처할 수 없습니다.

strace를 사용하여 파일 생성을 캡처할 수 없습니다.

빌드 디렉터리에서 다음 명령을 실행하면 make거의 비어 있습니다(해당 파일은 확실히 존재하지 않습니다).

strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>

완료되면 파일이 완전히 존재하게 됩니다. 따라서 make해당 자식 중 하나(또는 자식의 자식 등)가 생성했음이 틀림없습니다.

strace그러나 파일 이름 또는 을 찾기 위해 로그를 검색하면 creat파일 생성을 담당하는 시스템 호출을 찾을 수 없습니다.

내가 무엇을 놓치고 있나요? 모니터링해야 할 다른 시스템 호출이 있습니까?


편집하다:

내 strace 명령과 grep에 오류가 있는 것으로 나타났습니다. 모든 답변은 매우 도움이 됩니다. 시간을 내주셔서 감사합니다.

실제로 파일이 하위 디렉터리에 있다는 사실을 전달하는 데 실패했으며 파일 이름과 하위 디렉터리 이름을 가지고 greping하고 있습니다. 그러나 strace는 현재 작업 디렉터리에 대한 정보를 제공하지 않기 때문에 이 접근 방식은 제대로 작동하지 않습니다. (나는 결국 원하는 효과를 얻기 위해 strace를 수행 chdir하고 호출했습니다.)rename

따라서 Paul Haldane의 첫 번째 제안은 정확하고 요점입니다. 그리고 파일이 어떻게 생성되었는지 실제로 추측했다는 Larsquez의 대답.

답변1

해당 옵션 없이 strace를 실행 -e하고 결과가 개선되는지 확인하세요.

파일을 생성하는 방법에는 여러 가지가 있습니다. open이 파일을 생성하는 도구는 임시 파일을 먼저 열고 데이터를 쓴 다음 작업이 완료되면 파일 이름을 바꾸는 대신 파일 이름을 바꿀 가능성이 높습니다.

현재 제한 사항( execve,vfork,open,creat)에서는 이 동작이 표시되지 않습니다.

예를 들어 다음과 같은 간단한 Python 스크립트가 있다고 가정해 보겠습니다.

import os
import tempfile

fd = tempfile.NamedTemporaryFile(dir='.', delete=False)
fd.write('this is a test\n')
fd.close()

os.rename(fd.name, 'output')

매개변수를 사용하여 실행 strace한 후 output결과를 보면 아무것도 나오지 않습니다.

$ strace -e trace=execve,vfork,open,creat -o trace -f -s 80 python tmptest.py
$ grep output trace
$

-e하지만 필터를 제거하면 :

$ strace  -o trace -f -s 80 python tmptest.py
$ grep output trace
4523  rename("/home/lars/tmp/tmpZDwvPK", "output") = 0

귀하의 질문에 대한 의견에서 Sato Katsura는 출력에 대상 파일 이름이 표시되지 않는 예를 제공했지만 깨끗한 빌드 환경 조건으로 시작하는 한strace 런타임에 이 문제가 발생할 가능성은 거의 없다고 생각합니다.make

답변2

또 다른 옵션은sysdig, 예를 들어 명령은 다음과 같습니다.

sysdig -p '%proc.pname[%proc.ppid]: %proc.name -> %evt.type(%evt.args)' \
  evt.args contains /tmp/yourbuilddir

터미널에서 실행한 후 임시 파일을 사용하세요.코드 이름 바꾸기의:

#!/usr/bin/perl
use File::AtomicWrite;
File::AtomicWrite->write_file(
    {   file   => "/tmp/yourbuilddir/foofile",
        input  => \"blah",
        MKPATH => 1
    }
);

이를 실행한 후 sysdig다른 터미널에서 다시 실행하면 다음과 비슷한 내용이 표시됩니다.

bash[13645]: perl -> stat(res=-2(ENOENT) path=/tmp/yourbuilddir )
bash[13645]: perl -> stat(res=-2(ENOENT) path=/tmp/yourbuilddir )
bash[13645]: perl -> mkdir(path=/tmp/yourbuilddir mode=0 )
bash[13645]: perl -> stat(res=0 path=/tmp/yourbuilddir )
bash[13645]: perl -> stat(res=0 path=/tmp/yourbuilddir/ )
bash[13645]: perl -> stat(res=0 path=/tmp/yourbuilddir/ )
bash[13645]: perl -> open(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) name=/tmp/yourbuilddir/.tmp.8XUnHhOrIn flags=39(O_EXCL|O_CREAT|O_RDWR) mode=0 )
bash[13645]: perl -> ioctl(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) request=5401 argument=7FFEF6BE5020 )
bash[13645]: perl -> lseek(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) offset=0 whence=1(SEEK_CUR) )
bash[13645]: perl -> fstat(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) )
bash[13645]: perl -> fcntl(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) cmd=3(F_SETFD) )
bash[13645]: perl -> write(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) size=4 )
sshd[678]: sshd -> read(res=970 data=bash[13645]: perl -> stat(res=-2(ENOENT) path=/tmp/yourbuilddir )..bash[13645]:  )
bash[13645]: perl -> close(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) )
bash[13645]: perl -> rename(res=0 oldpath=/tmp/yourbuilddir/.tmp.8XUnHhOrIn newpath=/tmp/yourbuilddir/foofile )
sshd[678]: sshd -> read(res=186 data=bash[13645]: perl -> close(fd=3(<f>/tmp/yourbuilddir/.tmp.8XUnHhOrIn) )..bash[13 )

관련 정보