3

実行中に java.io.tempdir にいくつかの一時ファイルを作成するライブラリがあります。最初の質問は、linux/centos が開いている間に /tmp の一時ファイルを自動削除するかどうかです。願っていません!

2 番目の質問です。JVM が終了または中止されたときに一時ファイルが自動的にクリーンアップされるようにしたいと考えています。File.deleteOnExit はオプションではありません。一般に、ライブラリのクライアントが「ストリーム」を閉じると一時ファイルが削除されるためです。これらは非常に一時的なファイルであり、適切に使用すれば混乱することはありませんが、一時ファイルが削除されないためにクラッシュやその他の原因が発生する可能性があります.

最初のアイデアは、これを行う最善の方法は、File.createTempFile を使用するのではなく、/tmp 内に独自の一意の名前のフォルダー (名前のランダムな部分を持つ) を作成し、このフォルダー内にすべての一時ファイルを作成することです。次に、シャットダウン フックを登録し、VM インスタンスで使用されるフォルダーのパスを把握して、シャットダウン時にこのフォルダーを反復処理し、フォルダー内のすべてのファイルを削除してから、フォルダーを削除します。

開いているファイルを削除できるという事実に基づいて、これはLinuxで機能するように見えますが、シャットダウンフックが呼び出される前に一時ファイルストリームのクライアントがすべてのストリームを閉じているという私のライブラリの保証はありません。ファイルは削除されません。それは問題だ。

また、一部のコンテナではシャットダウン フックが許可されていない場合があり、許可されている場合でも、シャットダウン フックが呼び出されるという絶対的な保証はありません。

私が望むのは、起動時にライブラリが作成したガベージをクリーンアップする信頼できる方法で、このアプローチが同じマシンで実行されている複数の JVM で機能するようにすることです。

4

2 に答える 2

2

実行中に java.io.tempdir にいくつかの一時ファイルを作成するライブラリがあります。最初の質問は、linux/centos が開いている間に /tmp の一時ファイルを自動削除するかどうかです。願っていません!

これは、実行中のクリーンアップ スクリプトがあるかどうかによって異なります。しかし、UN*X マシンでは、JVM が開いているファイル記述子を保持するため、これは問題ではありません。これにより、閉じられるまで読み取り/書き込みが可能になります。ファイルシステムが閉じられると、スペースが自動的に解放されます。

2 番目の質問です。JVM が終了または中止されたときに一時ファイルが自動的にクリーンアップされるようにしたいと考えています。File.deleteOnExit はオプションではありません。一般に、ライブラリのクライアントが「ストリーム」を閉じると一時ファイルが削除されるためです。これらは非常に一時的なファイルであり、適切に使用すれば混乱することはありませんが、一時ファイルが削除されないためにクラッシュやその他の原因が発生する可能性があります.

UN*X サーバーでの一般的なトリックは、ファイルを開き、File.remove() を使用してファイル システムからエントリを削除することですが、読み書きは可能です。JVM がクラッシュするか正常に終了した場合、スペースは自動的に解放され、ファイルシステムにゴミの一時ファイルはありません。Windows では、もう少し問題があり、[失敗を無視して] File.remove() を試行する定期的なスイープを実装する必要があるかもしれません。

于 2012-05-12T23:55:51.733 に答える
0

はい、一時ファイル用の一時フォルダーを作成することは良い選択であり、それを行っても害はないと思います。ライブラリで自動削除ルーチンを作成して、x 日または x 時間よりも古い一時ファイルを削除することができます。また、ユーザーがこの時間を指定してデフォルト値を作成できるように、この時間を構成可能にすることができます。

DataSynapse サーバーでもこのアプローチを見てきました。

于 2012-05-12T17:02:32.230 に答える