その設定
program
ソースコードが利用できない(おそらく排他的/従来の)実行可能ファイルがあるとしましょう。
プログラムが実行されるたびに、渡されfile.txt
たコマンドライン引数に従って、常に同じ名前と常に同じディレクトリにファイルを生成しますprogram
。
質問
program
複数のインスタンスを同時に実行したいです。これは、サーバーがクライアントの実行要求をprogram
受信している状況で発生する可能性があります。program
問題は、両方のインスタンスが同じインスタンスに書き込むため、これは不可能であり、file.txt
ファイルが破損する可能性があることです。
考えられるソリューションのアイデア
program
何とか出力を一意の名前のファイルにリダイレクトできますか(ソースが失われたことを忘れないでください)?- どういうわけか「サンドボックス」して、
program
別のファイルシステムで実行されているかのように動作させることができますか(オーバーヘッドは無視できます)。 - 私は聞いたことがありますが、
LD_PRELOAD
C標準ライブラリ関数のオーバーライドにのみ適用されるのか、それとも一般的にLinuxシステムコールのオーバーライドにも適用されるのかはわかりません。
どんなアイデアがありますか?
答え1
プログラムが実行されるたびにファイルが生成されます。ファイルを「file.txt」と呼びます。常に同じ名前と常に同じディレクトリにあり、ファイルはプログラムに渡されるコマンドライン引数によって異なります。
プログラムが動的実行可能ファイルの場合は、次のように関数挿入を使用できます。LD_PRELOAD
ファイルを別の場所(環境変数で指定された場所など)に書き込むようにします。これは、呼び出しを傍受し、その呼び出しが宛先であることをopen
確認し、適切な代替を実行することを意味します。open
file.txt
プログラムがシステムサービスとして起動したら、次のものを使用できます。PrivateMounts
独自のマウントネームスペースでそれを実行し、それを書き込むことができる名前でマウントするオプションですfile.txt
。
@glennjackmanがコメントで提案したように、プロセスがコンテナで実行されるようにスケジュールすることもできます。これはデフォルトでは以前のソリューションと同じですが、システムの中断の代わりにDockerやPodmanなどのコンテナランタイムを使用して設定します。 。
上記のオプションのうち、コンテナ内で実行するのはおそらく操作上最も簡単な方法です。
「LD_PRELOAD」について聞いたことがありますが、これはC標準ライブラリ関数のオーバーライドにのみ機能するのか、それとも一般的なLinuxシステムコールのオーバーライドにも機能するのかわかりません。
関数の挿入によってLD_PRELOAD
関数呼び出しのみをブロックでき、システム呼び出しはブロックできません。しかし、これは一般的に大丈夫です。コードが呼び出されるときにopen
システムコールを直接呼び出すのではなく、open
syscallを呼び出すことです。これはglibcラッパー関数を呼び出し、それは順番にシステムコールを呼び出します。