Linuxでtmpフォルダーを安全にクリーンアップする方法


14

正確には、tmpfs / tmp、2GBにRAMを使用しています。通常、これで十分ですが、プロセスはそこにファイルを作成し、それ自体のクリーンアップに失敗する場合があります。これは、クラッシュした場合に発生する可能性があります。これらの孤立したtmpファイルを削除する必要があります。削除しないと、将来のプロセスで/ tmpのスペースが不足します。

/ tmpを安全にガベージコレクションするにはどうすればよいですか?最終更新タイムスタンプをチェックすることでそれを行う人もいますが、このアプローチは、それらのファイルを必要とする長時間実行されるプロセスが存在する可能性があるため、安全ではありません。より安全なアプローチは、最終変更タイムスタンプ条件を、プロセスがファイルのファイルハンドルを持たないという条件と組み合わせることです。このアプローチまたは他の安全なアプローチを具体化するプログラム/スクリプト/などはありますか?

ちなみに、Linux / Unixでは、作成プロセスでファイルが開くモードが許可されています。作成プロセスが終了したときに、たとえクラッシュからであっても、作成されたファイルは削除されます。


:あなたがtmpfsの代わりに/ tmpに使用できるかどうかをチェックしkernel.org/doc/Documentation/filesystems/tmpfs.txt
ott--

回答:


15

あなたはそのような何かを試してみたいかもしれません:

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%の地域のどこかにあります)。がありますがrelatimemtime変更された場合にのみアクセス時間を書き込むため、これは役に立ちません。

を使用する場合は、システム全体のパフォーマンスへの影響が大きくなりすぎないatimeよう/tmpに、別のパーティション(理想的にはRAMディスク)に配置することをお勧めします。

いったんatime有効になっている、あなたがしなければならないすべては、交換することである-mtimeと、上記のコマンドラインでパラメータを-atime
を削除できる-not -exec fuser -s {} ';'場合がありますが、念のためにそこに置いておきます(アプリケーションが長時間ファイルを開いたままにする場合)。

ただしecho、システムに必要なものを削除する前に、コマンドを使用してテストすることを忘れないでください!


いいね ファイルを更新していない間に長時間実行されるプロセスによって閉じられたファイルについてはどうですか?コンテキストファイルの場合、プロセスコンテキストを失う可能性があります(確かに、これはあまり賢いプロセスではありませんが、「ラテラル」/tmp/クリーンアップの予想される副作用を知る必要があります)。
nik

それがこのアプローチの問題です(最後の段落で指摘したように)。ここでの最善のアプローチは、uid / gidまたはファイルパターンチェックを追加することです(それに応じて回答を編集)
mreithub

これをcronスクリプトに配置する必要がありますか?
CMCDragonkai 14年

@CMCDragonkaiもちろん、これをcrontabに入れることができます。しかし、私が述べたように、アクセスされているが書き込まれていないファイルが存在する可能性があるため、この小さなスクリプトでは除外されない可能性があります。そのため、影響を受けるファイルのリストを最初に印刷してから、それらを削除するかどうかを自分で決定する方が安全です。あなたの場合は/tmp、別のパーティション(例えばA RAMディスク)上にある、あなたができる可能性がatimeそれのためにと使用-atimeのパラメータをfind
mreithub 14年

サーバー上でこれを行う予定です。したがって、tmp内のすべてのファイルを常にカウントするためにそこにいることはできません。問題はありますか?また、atimeではなくrelatimeを使用するつもりだったと思いますか?
CMCDragonkai 14年

3

自分で転がさないでください。

Debian / Ubuntuにはtmpreaperがあり、おそらく他の分野でも利用可能です。

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

/etc/tmpreaper.conf、私は両方を設定した場合、ファイル、/tmpおよび/var/tmpクリーンアップのディレクトリとして、長い間あなたがお勧め行うことができますTMPREAPER_TIMEパラメータまたはTMPファイルの前に最大を削除しますか?私は、/var/tmpファイルよりも/tmpファイルの年齢を長く保つ方が良いと聞きました。しかし、同じ最大年齢でしか設定できない場合、私は見当がつきません。
シャオドンチー

2

あなたの質問の最後の部分に関して:

「このi-if-i-dieを削除する」オープン/作成モードは存在しないと思いますが、プロセスは、ファイルを開いたままにしておけば、ファイルを作成後に直接安全に削除できます。その後、カーネルはファイルをディスク上に保持し、ファイルを開いた最後のプロセスが終了するとすぐに(クラッシュまたは通常)、ファイルが占有していたスペースが解放されます。

一部のプロセスが/ tmpをクリーンアップしないことがあるという問題を回避する一般的な方法については、ここまたはここで説明するマウント名前空間を確認することをお勧めします。問題のプロセスがシステムデーモンである場合、systemdと、プライベート/ tmpファイルシステムを許可するネイティブ機能に関心があるかもしれません。



0

それより古いファイルのリストを取得し、そのリストから何かで開いているファイルを除外します。

find /tmp -mtime +7 |\
    egrep -v "`lsof -n +D /tmp | awk 'NR>1 {print $9}'| tr \\n \|`" 

lsof -n +D /tmp:/ tmpで開いているファイルを探します
awk 'NR>1 {print $9}':ヘッダーを除くlsof出力の9列目のみを出力します
tr \\n \|:改行をバーで置き換えます(またはegrepで)
egrep -v "foo|moo|bar":fooまたはmooまたはbarを含まない行を出力します


0

私は上記に同意しますが、それに追加するために-私は常にlsof +L1 | grep tmp「削除された」tmpファイルを保持しているプロセスを実行し、強制終了または再起動します:

# lsof +L1 | grep tmp
xfce4-ter  1699  user   32u   REG    8,6      192     0 818552 /tmp/vte966VLX (deleted)
chrome     3301  user  138u   REG    8,6    16400     0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted)

2
SUは投稿をランダムに配置します。上または下はありません。どの投稿を参照していますか?
ジャーニーマンオタク

0

あなたはただすることができrm -rf /tmp/*、何も壊れないことを願っています...


「何かが壊れないことを願って」何かを提案することは、OPの「実際にこれを行う安全な方法はありますか。あなたの提案が安全である理由について詳しく説明できるかもしれません。」
18

@bertieb良い点。私は...それはrootとして実行されないなら、それはおそらく安全だと思うが、
ソロモンUcko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.