コンテキスト
私は標準のシェルスクリプトからMakefileを自動的に生成するツールを設計したいと思います。
アイデアは、スクリプトによって実行される各コマンドに対して読み書きしたファイルを登録し、関連コマンドとともにMakefileに関連する依存関係を生成することです。私はそのようなコマンドの範囲を制限したくありません。難解な言語のコンパイラ呼び出し、テストスイート、パッケージングシステムなどになる可能性があります。
実際、Makefileはツールのキャッシュにすぎません。並列に実行できるコマンドの提案を提供します。最初の実行では、完全な順次依存関係を想定し、どのコマンドがどのファイルを読み書きするかを観察します。これには、再実行する必要があるコマンドのみを実行するメカニズムがあります。ラ作る。微妙なことは、コマンドがまだ最新でないファイル(新しい依存関係)を読み取ろうとすると、ファイルが更新されるまで傍受する呼び出しが停止されることです。
質問
どのコマンドがどのファイルにアクセスしたかを検出するには、リアルタイムでファイルへのアクセスをブロックする必要があります。
使用を検討しましたが、LD_PRELOAD
すべてのコマンドがlibc
呼び出しを使用してシステム呼び出しを実行すると仮定します。これらのシステムコールをキャプチャするために独自のカーネルモジュールを実装することを検討しましたが、ツールに不適切な権限が必要でした。
2つの解決策があります。
- デバッグモードでコマンドを実行する
- オペレーティングシステムの仮想化機能を使用して仮想環境でコマンドを実行する
デバッグモードでは、これらの呼び出しを傍受するのに十分な制御機能を提供しますか?たとえば、すでにデバッグモードで実行されている子プロセスのコマンドスタックで動作しますか?
そうでない場合、プロセッサの仮想化機能を使用するにはどのくらいの作業が必要ですか?つまり、仮想化されたオペレーティングシステムはほとんど透過的です(持続動作を除く)。無関係なシステムコールをたくさん実装する必要がありますか?
仮説
私はユーザースペースコマンドでアクセスされるファイルだけに興味があり、プログラムが特権モードで実行されている場合は「監視」できるようにしたくありません。ファイルがコマンドによって生成/更新されるか、シードであると仮定します。