/ tmpの内容を手動で削除することになっていますか?


26

「古い」ファイルは/tmp定期的に削除されるという印象を受けました。ただし、必要な/tmp限り成長するだけで、何も削除されないようです。一部の人は/tmp、ディスクがいっぱいになった場合にのみ、そのままにして内容を削除する方が良いと言います。

私の質問は、/tmp本当に自分自身の世話をしないように設計されていますか?ベストプラクティスは何ですか?


1
通常/tmp、再起動後にクリーンになりますが、これはそこにマウントされているファイルシステムに依存します。何てdf -h言うの?
-etagenklo

回答:


27

質問に答えるには:

  • され/tmp、自動的に空にすることになって。はい
  • ファイルを/tmp定期的かつ手動で削除することになっていますか?いいえシステムがそれらを処理します。

自問する場合:

  • /tmp何らかの理由でファイルを削除できますか(スペースが必要、トレースを削除したいなど):依存し読み取ります

Filesystem Hierarchy Standard(FHS)の状態

/ tmpディレクトリは、一時ファイルを必要とするプログラムで使用可能にする必要があります。

プログラムは、/ tmp内のファイルまたはディレクトリがプログラムの呼び出し間で保持されると想定してはなりません。

/var/tmp/持っている同様の目的を、しかし、してはならない、再起動時に削除されます。

それは保証されませんという/tmp/か、/var/tmp/定期的にクリーンアップされます。ほとんどのシステムは時々クリーンアップを行いますが、これはディストリビューションと設定によって異なります。によるコメントを参照してくださいmike

/ tmp内のファイルを削除する必要がある場合は、最初にファイルが使用中かどうかを確認してください。これを簡単に行うことができます:

lsof /tmp/file_to_delete

そのための権限がある場合、プロセスの名前、PID、ファイルの種類など、そのファイルへのハンドルを保持しているプロセスが表示されます。実際にすべてのプロセスを表示sudoするには、ユーザーrootとして追加または実行します。

lsof +D /tmp

現在開いているすべてのファイル/tmp+Dその下のディレクトリ()が表示されます。もちろん、これらのファイルは削除しないでください。

実際、まだ開いているファイルを削除すると、その権限がある場合、ファイルシステムの名前空間からアクセスできなくなりますが、開いているファイルハンドルを持つプロセスにはまだ存在しています。そのハンドルを閉じた後、ファイルはそのプロセスからアクセスできなくなり、ファイルを開いたプロセスがなくなった場合、最終的に削除されます。プロセスは、ファイルが後続のopen呼び出し間で存続することを想定すべきではありませんが、プログラマーはだらしないため、あなたは決して知りません。そのため、一部のプログラムでまだ使用されているファイルを削除するのは賢くありません。


一般に、これはすべての優れたアドバイスです。特に最後の段落です。しかし、システムが実際に/ tmpをクリーンアップするかどうかは、そのシステムに依存しています。たとえば、openSUSEでは、(/ etc / sysconfigから、またはYaST経由で)設定しない限り、そうしませ。また、ユーザーの個人的な〜/ tmp(ある場合)は自動的にクリアされません。
マイク

プロセスが開いているファイルを削除することはまだ可能ですか?そして、これはプログラムをクラッシュさせませんか?ファイルはどこにありますか?プログラムはこの「開かれているが同時に削除された」ファイルと引き続き対話できますか?rmがファイルを削除するのを困難または不可能にする方法はありますか?おそらくファイルロックのようなものですか?
CMCDragonkai

ファイルは、ファイルシステム内のデータセットであり、パスとファイル名を介して階層名前空間でアクセス可能になります。ファイルは複数の名前(ハードリンク)を持つことができ、プロセスはファイルのオープンハンドルを持つことができます。ファイルにアクセスできない場合、つまり名前も開いているハンドルもない場合は削除されます。削除の防止は私の専門知識を超えており、IMOはこの質問の範囲を超えています。「データロック」を探してみてください。
trapicki

[重複回答]
-trapicki

4

これはOSに依存するものだと思います。通常、/ tmpはリブート時にクリアされ、実際にシステムがセッション中にクリーンアップすることは安全ではないでしょう。どのファイルがアクティブかわからないからです。

勇気があるなら、特定の年齢より古いファイルを削除するコマンドをcrontabに投げたいかもしれませんが、まだ使用されているファイルを削除する場合、これはいくつかの問題を引き起こすかもしれません。次のようなコマンドを試すことができます(私は試していません)

find / tmp -type f -ctime +10 -exec rm {} +

理論的には、10日より古い/ tmpの下のすべてのファイルが削除されます。


それにおそらく追加-rする必要があります
スティーブンペニー

1
絶対に-rを追加しないでください。これは、10日以上前に作成されたディレクトリに存在する10日未満のファイルを削除したり削除したりする効果があります。実際には、コマンドはおそらく/ tmp -type f -ctime +10 -exec rm {} +を見つけて、ファイルへの検索を制限する必要があります。(findコマンドを使用すると、サブディレクトリが再帰されます)
davidgo

1

/ tmpおよび/ var / tmpディレクトリは、通常のスケジュールで削除されます。これはディストリビューションに依存する場合があります。私のCentOSシステム(RedHatのクローン)には、tmpディレクトリクリーナーであるtmpwatchを毎日のスケジュールで実行するようにスケジュールされたcronジョブがあります。/ var / tmp内のファイルは、/ tmp /内のファイルよりも少し長く動き続けることができます。また、再起動時に/ tmp(ただし/ var / tmpではない)を削除するスクリプトも見ました。すべてのプロセスが新しいため、そのファイルを開いたままにすることはできないことがわかっています。

そのため、/ tmpには基本的なスクリプトからのメンテナンスがあります。これらのメンテナンス時間外でも満杯になる可能性があります。手動でクリーニングすることを選択した場合、sysadminのベストプラクティスは注意することです。システム管理者の伝承は、n00b sysadminsが単純なfindスクリプトを実行したときに削除された必要なシステムファイルを指す/ tmpのシンボリックリンクについて説明します。


2
Centos 7およびsystemdを使用するその他のRedHatのようなバージョン7+システムでは、クリーンアップは/usr/lib/tmpfiles.d/tmp.confで構成されます。これは、systemdのターゲットsystemd-tmpfiles-clean.serviceによって呼び出されます。
shonky linuxユーザー

1

CentOSには、特定の時間アクセスされていないファイルを再帰的に削除する/etc/cron.dailyという、呼ばれるジョブがありtmpwatchます。通常、/ tmpなどの一時的な保持スペースに使用されるディレクトリをクリーンアップするために使用されます。

これは/etc/cron.daily/tmpwatchスクリプトです

#!/ bin / sh
flags = -umc
/ usr / sbin / tmpwatch "$ flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/ tmp / hsperfdata_ *' 10d / tmp
/ usr / sbin / tmpwatch "$ flags" 30d / var / tmp
/ var / {cache / man、catman} / {cat?、X11R6 / cat?、local / cat?}のd 行う
    if [-d "$ d"]; それから
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
やった

/tmp 実行中のプロセスがそのディレクトリのファイルにアクセスしている可能性があるため、ディレクトリの内容はシステムの再起動時にのみ削除されます。


0

からコンテンツを削除でき/tmp/ます。しかし、そうすることの問題は、定期的に書き込みを/tmp/行うサービスがあり、ファイルを削除すると、再起動されるまでサービスがクラッシュしたり中断したりする可能性があることです。


0

FHSが規定し/tmp、「一時ファイル(またの/ var / tmpのを参照)、多くの場合、システムの再起動時に保持されない」などのディレクトリを、そして/var/tmp「一時ファイルは、再起動の間に保存されるように」と。

最近では/tmp、多くのGNU / LinuxディストリビューションでRAMファイルシステム(tmpfs)がデフォルトで(オプションではありますが)存在するため、/tmp事実上非永続的です。

(ほぼ間違いなく)アプリケーションはそれに応じて一時ファイルを管理する必要があります。これには、使用が終了したときに削除することも含まれ、管理者は破壊的な削除をスケジュールする必要はありません。


多くのプログラムは、ファイルの処理/tmpが終了したとき、または終了したときにファイルをクリーンアップするより良い仕事をすることができます/tmpが、プログラムの異常終了(クラッシュ)の後に残ったファイルの問題が依然として存在します。
ケビンフェガン

0

Debian(またはUbuntuのような派生物)を実行している場合は、/ etc / default / rcS ファイルを調べTMPTIME環境変数を調整する必要があります。定義により、/ tmpにあるものは、次回の再起動時にここで行うことはありません。

私はお勧め

  • TMPTIMEサーバーで変数を使用する
  • / tmpをデスクトップに(ramで)tmpfsとしてマウントします(高速化のため)

0

ディストリビューションはもちろん異なりますが、私は一時ファイルがシステムからすぐに自動的に管理されることを期待しています。cronジョブまたはsystemd-tmpfiles-cleanサービスのいずれかを使用する可能性があります。ディスク容量が心配な場合、これは各ルートフォルダーが使用している容量を確認するのに便利なコマンドです。

du -hs /* | sort -h

システムが一時ファイルの管理にsystemdサービスを使用しているかどうかを確認するには、次を試してください。

systemctl status systemd-tmpfiles-clean

下部に次のようなものが表示され、サービスが最後に実行されたときがわかります。

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

このサービスは、クリーンアップが完了するとすぐに終了することに注意してください。タイマーサービスは、定期的にそれをトリガーする責任があります。次の方法で確認できます。

systemctl status systemd-tmpfiles-clean.timer

そして、次のようなものを期待する必要があります。

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

ファイルのクリーニングを担当する実際のサービスをもう一度見ると、実行されるのはすべて実行されていることがわかります。

/usr/bin/systemd-tmpfiles --clean

そのため、そのコマンドを直接実行するか、適切に実行するには次のようにします。

systemctl start systemd-tmpfiles-clean

これにより、システムに適切なコマンドが実行されます。ただし、これは「今すぐすべての一時ファイルを削除する」コマンドではないことに注意してください。実際に削除されるものといつアプリケーションが個々に一時ファイルを構成できるようにするかを制御するいくつかの構成ファイルがあります。

一時ファイルの一般的な処理を探す場所の1つ/usr/lib/tmpfiles.d/tmp.confは、次の関連行がある可能性があります。

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

システムが次のようにスペースを使い果たしている場合は、これらをより短い時間に変更できます。

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

何をしているのかを確認man tmpfiles.dするには、マニュアルを読んでください。繰り返しますが、ここで紹介するアプローチはCentOS(RedHatベース)とUbuntuシステムに関連していることがわかりましたが、他のディストリビューションについてはあまり知りません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.