28134


シェルスクリプトなどで `/tmp` フォルダを利用したスクリプトを記述することがあります。  
tmp フォルダにあるファイルは、これは定期的な削除の対象でしょうか。

その場合、どのような基準で削除されるのでしょうか。

意図しない削除によって、スクリプトの動作がおかしくなるといやなので、質問しています。例えば、ある定時に空になる運用だったときに、その時間に `/tmp`
フォルダを利用するスクリプトが走っていると、動作がおかしくなる、など。


CC BY-SA 3.0
2016-08-08T03:37:30.590
28115
2016-08-09T03:25:45.317
2016-08-08T14:56:12.467
754
754
question
linux
/tmp フォルダの削除ロジックは？


UNIX のファイルシステムの特徴として  
オープンされたままのファイルが `rm` で削除されるとき、  
\- ディレクトリ中の `inode` へのリンクは除去される＝ファイル名は消去される  
\- `inode` 自体は削除されない＝ファイルの内容はそのまま残り、アクセス可能  
\- ファイルが閉じられるとき `inode` も未使用状態になる＝ファイルの内容にアクセスできなくなる

なので、  
\- プロセスＡが作業ファイルを開いたまま  
\- プロセスＢがその作業ファイルを削除したとしても  
\- プロセスＡは引き続き作業ファイルの内容にアクセスすることができる(オープンしている限り)  
ため、そんなに問題になることはありません。

プロセスＡが作業ファイルをいったんクローズし、クローズ後に再度開こうとすると  
クローズした時点でファイル名、ファイル本体とも失われているため、  
２度目のファイルオープンには失敗します。

なので `/tmp` 中のファイルをいつ削除しようとしても、問題は発生しないのが普通です。  
逆に言うと、作業ファイルを作業中に削除されても問題ないようにプログラムを組むには、  
プログラムは、作業ファイルを処理完了まで開きっぱなしにするのが正しい態度で、  
途中で開き直すのはやめたほうが良い、ということになります。

弊害として、巨大な作業ファイルをオープンしっぱなしなプログラムが居るとき  
(database 系ソフトなんかそうですね)  
作業ファイルやデータベースファイルを削除しても「それだけでは」ディスク容量は空かないということになります。  
当該プロセスを終了させないと `inode` が開放されないためです。

`lsof` コマンドなどを参照してください (`osdn JM` に `man` ページが無いな...)


CC BY-SA 3.0
2016-08-08T05:07:50.283
28119
2016-08-08T05:07:50.283
8589
28115
answer


ディストリビューションのデフォルトや管理者の設定によってどうとでもなります。ただし、たいていは「（再）起動時に消す」「○日以上更新されていないファイルは定期的に消す」といったロジックになっていると思います。作られて数分の一時ファイルが消されるような設定にはしないはず。

ちなみにPOSIXやFHS (Filesystem Hierarchy
Standard)では、/tmpは再起動してファイルが残っていることを保証しないと言っています。またFHSでは、/var/tmpを、再起動しても消えない一時ファイルのためのディレクトリとしています。


CC BY-SA 3.0
2016-08-08T14:27:53.800
28134
2016-08-08T14:27:53.800
4010
28115
answer


RHEL 6 やそれ以前なら `tmpwatch`(8) と `/etc/cron.daily/tmpwatch` を、RHEL 7 や systemd
な環境であれば `systemd-tmpfiles`(8) を参照。


CC BY-SA 3.0
2016-08-09T03:25:45.317
28142
2016-08-09T03:25:45.317
3061
28115
answer