/tmp
の「古い」ファイルは定期的に削除されるのではないかという印象を受けました。ただし、/tmp
は必要なだけ成長し、何も削除されないようです。 /tmp
をそのままにして、ディスクがいっぱいになっている場合にのみその内容を削除する方がよいと言う人もいます。
私の質問は、/tmp
は本当に自分自身を処理しないように設計されているのですか?ベストプラクティスは何ですか?
質問に答えるには:
/tmp
は自動的に空になるはずです:はい/tmp
のファイルを定期的かつ手動で削除することになっていますか:No、システムがそれらを処理します。あなたが自問するかもしれない場合:
/tmp
からファイルを削除できますか:それは依存します、read on。ファイルシステム階層標準(FHS) states :
/ tmpディレクトリは、一時ファイルを必要とするプログラムで使用できるようにする必要があります。
プログラムは、/ tmp内のファイルまたはディレクトリがプログラムの呼び出し間で保持されると想定してはなりません。
/var/tmp/
には 同様の目的 がありますが、は再起動中に削除しないでください。
/tmp/
または/var/tmp/
が定期的にクリーンアップされることは保証されていません。これは、ディストリビューションと設定によって異なる場合がありますが、ほとんどのシステムでは、時々クリーンアップが行われます。 mike
による comment を参照してください。
/ tmp内のファイルを削除する必要がある場合は、まずファイルが使用中かどうかを確認してください。あなたはこれで簡単にこれを行うことができます:
lsof /tmp/file_to_delete
実行する権限がある場合は、プロセス名、PID、ファイルの種類など、そのファイルへのハンドルを保持しているプロセスが表示されます。本当にすべてのプロセスを表示するには、Sudo
を前に付けるか、ユーザーrootとして実行します。
lsof +D /tmp
現在開いている/tmp
およびその下のディレクトリ(+D
)内のすべてのファイルが表示されます。もちろん、これらのファイルは削除しないでください。
実際、まだ開いているファイルを削除すると(削除する権限がある場合)、ファイルシステムの名前空間からアクセスできなくなりますが、開いているファイルハンドルを持つプロセスには引き続き存在します。そのハンドルを閉じた後、そのプロセスはファイルにアクセスできなくなり、プロセスがファイルを開いていなければ、最終的に削除されます。プロセスは、ファイルが後続のopen
呼び出しの間でも存続すると想定すべきではありませんが、プログラマーはずさんであり、あなたは決して知りません。そのため、一部のプログラムでまだ使用されているファイルを削除するのは賢くありません。
これはOSバリアントに依存すると思います。/tmpは通常、再起動時にクリアされると思います。実際、システムがセッションの途中で自分自身をクリーンアップするのは安全ではありません。アクティブなファイルがわからないためです。
勇気がある場合は、特定の期間より古いファイルを削除するコマンドをcrontabにスローすることをお勧めしますが、使用されているファイルを削除すると問題が発生する可能性があります。あなたは次のようなコマンドを試すかもしれません(私は試していません)
find/tmp -type f -ctime +10 -exec rm {} +
理論的には、/ tmpの下の10日より古いすべてのファイルが削除されます。
/ tmpおよび/ var/tmpディレクトリは、通常のスケジュールでクリーンアップされます。これはディストリビューションによって異なる場合があります。私のCentOSシステム(RedHatのクローン)には、 (1日のスケジュール )でtmp dirクリーナーである tmpwatch を実行するようにスケジュールされたcronジョブがあります。/var/tmp内のファイルは、/ tmp /内のファイルよりも少し長くとどまることができます。すべてのプロセスが新しいので、ファイルを開いたままにしておくものは何もないことを知って、再起動時に/ tmpをプルーニングするスクリプト(ただし、明示的に/ var/tmpではない)も確認しました。
つまり、はい、/ tmpには基本的なスクリプトによるメンテナンスがあります。それでも、これらのメンテナンス時間外に満杯になる可能性があります。手動でクリーニングすることを選択した場合、sysadminのベストプラクティスは注意することです。 Sysadmin loreは、/ tmp内のシンボリックリンクについて話し、n00b sysadminsが単純なfind
スクリプトを実行したときに削除された必要なシステムファイルを指します。
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 for d in/var/{cache/man、catman}/{cat?、X11R6/cat?、local/cat?} ; do if [-d "$ d"];次に /usr/sbin/tmpwatch "$ flags" -f 30d "$ d" fi done
/tmp
ディレクトリの内容は、実行中のプロセスがそのディレクトリからファイルにアクセスしている可能性があるため、システムの再起動時にのみ削除されます。
Debian(またはUbuntuのような派生物)を実行している場合は、 / etc/default/rcS ファイルを調べて、TMPTIME
環境変数を調整する必要があります。定義上、/ tmpにあるものは、次回の再起動時にここでは何もしません。
私はお勧め
TMPTIME
変数を使用するもちろんディストリビューションは異なりますが、一時ファイルはシステムが標準で自動的に管理することを期待しています。 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システムに関連していることがわかりましたが、他のディストリビューションについてはあまり知りません。
[〜#〜] fhs [〜#〜] は、/tmp
ディレクトリを「一時ファイル(/ var/tmpも参照)、システムの再起動間では保持されないことが多い」として定義し、/var/tmp
は、「再起動しても保持される一時ファイル」です。
現在、多くのGNU/Linuxディストリビューションでは、/tmp
がデフォルトでRAMファイルシステム(tmpfs)(オプションですが)であるため、/tmp
は実質的に非永続的です。
(間違いなく)アプリケーションはそれに応じて一時ファイルを管理する必要があります。これには、使用が終了したときに一時ファイルを削除することが含まれ、管理者が破壊的な削除をスケジュールする必要はありません。
/tmp/
からコンテンツを削除できます。しかし、そうすることの問題は、/tmp/
に定期的に書き込むサービスがあり、ファイルを削除すると、サービスがクラッシュするか、サービスが再起動するまで中断する可能性があることです。