ビルドディレクトリで次のコマンドを実行すると、ほとんど空になりますmake
(ファイルは間違いなく存在しません)。
strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>
完了すると、ファイルが完全に存在します。したがって、make
その子の1つ(または子の子など)が作成したに違いありません。
strace
ただし、ファイル名またはファイルを検索するためにログを検索すると、creat
ファイルの作成を担当するシステムコールが見つかりません。
私は何を見逃していますか?監視する必要がある他のシステムコールはありますか?
編集する:
私のstraceコマンドとgrepにエラーがあることがわかりました。すべての答えは非常に役立ちます。お時間をいただきありがとうございます。
実際には、ファイルがサブディレクトリにあるという事実を渡すことができませんでした。ただし、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