あなたはそのような何かを試してみたいかもしれません:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
findは、特定の条件に一致するファイルを見つけるために使用されます。
-mtime +7
7日より古いファイルのみを選択します(他の値を使用できます)
-exec fuser -s {} ';'
古さの基準に一致するすべてのファイルに対して、サイレントモードでfuserを呼び出します。fuserは、現在アクセスされているすべてのファイルに対して0(= true)を返し、アクセスされていないファイルに対して1(= false)を返します。アクセスされていないものだけに興味があるので-not
、この前に-exec
-exec echo {} ';'
基準に一致するすべてのファイル名を印刷するだけです。-exec rm {} ';'
代わりにここで使用することもできますが、これにより使用中のファイルが削除される可能性があるため、最初に単純なエコーを実行する方が安全だと思います。
- 編集:偶発的な影響を避けるために、特定のファイルパターンまたはユーザーIDにクリーンアップの効果を制限し
-name 'foo*.bar'
たり、追加したり-uid 123
することができます。
最後まで:一度だけ書き込まれるファイル(システムのブート時など)が頻繁に読み取られるファイル(XセッションCookieなど)がある可能性があることを考慮してください。したがって、障害のあるプログラムによって作成されたファイルにのみ影響を与えるために、名前のチェックを追加することをお勧めします。
edit2:
最後の質問:プロセスは、少なくともネイティブLinuxファイルシステムの場合、オープンハンドルを持つプロセスがなくなるまで、ディスクから削除されません。問題は、ディレクトリエントリがすぐに削除されることです。つまり、ファイルを削除した時点から、新しいプロセスはファイルを開くことができなくなります(ファイル名が添付されていないため)。
詳細については、https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linuxを参照して
ください
edit3:しかし、プロセス全体を自動化する場合はどうなりますか?
先ほど言ったように、一度書き込まれた後に時々読み込まれるファイルがあります(XセッションCookie、PIDファイルなど)。これらは、この小さな削除スクリプトによって除外されません(echo
実際にファイルを削除する前に最初にテストを実行したい理由です)。
安全なソリューションを実装する1つの方法は、を使用することatime
です。
atime
各ファイルが最後にアクセスされた時刻を保存します。ただし、このファイルシステムオプションは、パフォーマンスにかなりの影響があるため、多くの場合無効になっています(このブログによると、20〜30%の地域のどこかにあります)。がありますがrelatime
、mtime
変更された場合にのみアクセス時間を書き込むため、これは役に立ちません。
を使用する場合は、システム全体のパフォーマンスへの影響が大きくなりすぎないatime
よう/tmp
に、別のパーティション(理想的にはRAMディスク)に配置することをお勧めします。
いったんatime
有効になっている、あなたがしなければならないすべては、交換することである-mtime
と、上記のコマンドラインでパラメータを-atime
。
を削除できる-not -exec fuser -s {} ';'
場合がありますが、念のためにそこに置いておきます(アプリケーションが長時間ファイルを開いたままにする場合)。
ただしecho
、システムに必要なものを削除する前に、コマンドを使用してテストすることを忘れないでください!