次のようなことを試してみてください:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find は、特定の条件に一致するファイルを見つけるために使用されます。
-mtime +7
7 日以上経過したファイルのみを選択します (他の値を使用することもできます)-exec fuser -s {} ';'
oldness 基準に一致するすべてのファイルに対して、fuser をサイレント モードで呼び出します。 fuser は、現在アクセスされているすべてのファイルに対して 0 (=true) を返し、アクセスされていないファイルに対して 1 (=false) を返します。アクセスされていないものだけに関心があるので、-not
を入れます この-exec
の前に-exec echo {} ';'
基準に一致するすべてのファイル名を出力するだけです。-exec rm {} ';'
を使用したい場合があります ここでは代わりに、まだ使用中のファイルを削除する可能性があるため、最初に単純なエコーを実行する方が安全だと思います.- 編集:
-name 'foo*.bar'
のようなものを追加したいかもしれません または-uid 123
クリーンアップの影響を特定のファイル パターンまたはユーザー ID に制限して、偶発的な影響を回避します。
最後のポイント:1 回だけ書き込まれる (システムの起動時など) が頻繁に読み取られるファイル (X-session-cookie など) が存在する可能性があることを考慮してください。したがって、問題のあるプログラムによって作成されたファイルのみに影響を与える名前チェックを追加することをお勧めします。
編集 2: あなたの最後の質問に:ファイルは、プロセスが開いているハンドルを持たなくなるまで、ディスクから削除されません (少なくともネイティブ 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
を使用してコマンドをテストすることを忘れないでください システムがまだ必要としているものを削除してしまう前に!
自分で巻かないでください。
Debian/Ubuntu には tmpreaper があり、おそらく他のディストリビューションでも利用できます。
# tmpreaper - cleans up files in directories based on their age
sudo apt-get install tmpreaper
cat /etc/tmpreaper.conf
質問の最後の部分について:
「死んだらこれを削除する」オープン/作成モードは存在しないと思いますが、プロセスは、そのファイルへのハンドルを開いたままにしておく限り、ファイルを作成した直後に安全に削除できます。その後、カーネルはファイルをディスク上に保持し、ファイルを開いた最後のプロセスが終了するとすぐに (クラッシュまたは通常)、ファイルが占有していたスペースが解放されます。
一部のプロセスが /tmp をクリーンアップしないことがあるという問題を回避する一般的な方法については、マウント名前空間を確認することをお勧めします。たとえば、ここまたはここで説明されています。問題のプロセスがシステム デーモンである場合、systemd とそのネイティブ機能がプライベートな /tmp ファイルシステムを許可することに関心があるかもしれません。