빌드 디렉터리에서 다음 명령을 실행하면 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 )