プロセスがファイルを上書きするのを防ぐ

プロセスがファイルを上書きするのを防ぐ

その設定

programソースコードが利用できない(おそらく排他的/従来の)実行可能ファイルがあるとしましょう。

プログラムが実行されるたびに、渡されfile.txtたコマンドライン引数に従って、常に同じ名前と常に同じディレクトリにファイルを生成しますprogram

質問

program複数のインスタンスを同時に実行したいです。これは、サーバーがクライアントの実行要求をprogram受信して​​いる状況で発生する可能性があります。program

問題は、両方のインスタンスが同じインスタンスに書き込むため、これは不可能であり、file.txtファイルが破損する可能性があることです。

考えられるソリューションのアイデア

  • program何とか出力を一意の名前のファイルにリダイレクトできますか(ソースが失われたことを忘れないでください)?
  • どういうわけか「サンドボックス」して、program別のファイルシステムで実行されているかのように動作させることができますか(オーバーヘッドは無視できます)。
  • 私は聞いたことがありますが、LD_PRELOADC標準ライブラリ関数のオーバーライドにのみ適用されるのか、それとも一般的にLinuxシステムコールのオーバーライドにも適用されるのかはわかりません。

どんなアイデアがありますか?

ベストアンサー1

プログラムが実行されるたびにファイルが生成されます。ファイルを「file.txt」と呼びます。常に同じ名前と常に同じディレクトリにあり、ファイルはプログラムに渡されるコマンドライン引数によって異なります。

プログラムが動的実行可能ファイルの場合は、次のように関数挿入を使用できます。LD_PRELOADファイルを別の場所(環境変数で指定された場所など)に書き込むようにします。これは、呼び出しを傍受し、その呼び出しが宛先であることをopen確認し、適切な代替を実行することを意味します。openfile.txt

プログラムがシステムサービスとして起動したら、次のものを使用できます。PrivateMounts独自のマウントネームスペースでそれを実行し、それを書き込むことができる名前でマウントするオプションですfile.txt

@glennjackmanがコメントで提案したように、プロセスがコンテナで実行されるようにスケジュールすることもできます。これはデフォルトでは以前のソリューションと同じですが、システムの中断の代わりにDockerやPodmanなどのコンテナランタイムを使用して設定します。 。


上記のオプションのうち、コンテナ内で実行するのはおそらく操作上最も簡単な方法です。


「LD_PRELOAD」について聞いたことがありますが、これはC標準ライブラリ関数のオーバーライドにのみ機能するのか、それとも一般的なLinuxシステムコールのオーバーライドにも機能するのかわかりません。

関数の挿入によってLD_PRELOAD関数呼び出しのみをブロックでき、システム呼び出しはブロックできません。しかし、これは一般的に大丈夫です。コードが呼び出されるときにopenシステムコールを直接呼び出すのではなく、opensyscallを呼び出すことです。これはglibcラッパー関数を呼び出し、それは順番にシステムコールを呼び出します。

おすすめ記事