/ tmpの存在が保証されていますか?


42

/tmp内部のファイルに書き込む前にチェックして作成する必要がありますか?それsudo rm -rf /tmpは非常にまれなケースだからだれも走っていないと仮定する


16
「保証」とはどういう意味ですか?FHSにはそれが必要であるため、FHS準拠のディストリビューションに必要です。ただし、FHSに準拠していない多くの特別な目的のディストリビューションがあります。/ tmpなしでUnix / Linuxディストリビューションを作成することは確かに可能ですが、それを気にする必要があるかどうかは、それらのシステムのサポートを気にするかどうかに完全に依存します。
ライライアン

1
次の再起動に頼ってクリーンアップするのではなく、独自の一時ディレクトリを作成して削除したらどうですか?
WGroleau

4
@WGroleau OPについては知りませんが、自分のシステム用に作成したスクリプトでは、通常、一時ファイルを/tmp(で作成されたmktemp)のサブディレクトリに入れ、終了時にそのサブディレクトリを削除します。私のシステムのほとんどは読み取り専用でマウントされているcdため、書き込み可能なディレクトリを覚えておく必要がありません。
Fox

1
@WGroleauクリーンアップのために再起動に頼っていません。mktempルックスは本当に素晴らしい、i'lおそらくそれを使用して終了します。
アユーシュ

7
@jamesqfええ、クリアするには再起動は必要ありません/tmp。しかし、逆にそうすることは許可されており、おそらくWGroleauはそれから遠すぎる外挿をしていると思われます。My /tmptmpfsRAMに保持されているため、シャットダウン時にクリアされます。それでも、それはシステムの単なる詳細であり、FHSによって保証されているわけではありません。だから、元のコメントに、それは存在に依存する愚かだで何かの不在/tmpブーツの間。
underscore_d

回答:


60

FHSの義務/tmpが存在するなどしPOSIXを使用すると、そのがそこにいるに頼ることができるように(準拠のシステム上に、少なくとも、本当にかなり多くのUnixライクなシステムに存在することが保証されています)。しかし、すべきではありません。システム管理者またはユーザーは、一時ファイル用に他の場所を好むかもしれません。詳細については、複数のプラットフォームの正しいtmpディレクトリの検索を参照してください。


これはもちろん設計の失敗です。/tmp名前です。$TMPDIR別の名前です。/tmp一時ディレクトリの正しい名前に頼ることができない場合$TMPDIR、正しい環境変数の名前に頼ることができるのはなぜですか?その変数の$TMPDIRVAR名前を取得するためにチェックするべきではないのはなぜですか?1レベルの間接参照で十分であり、 まさにそれです。実際のストレージについては何も言わず、単なる名前です。/tmp
-MSalters

@MSaltersにはそれ以上のことがあります。名前空間の前に、$TMPDIR各ユーザーが個別の一時ディレクトリを持つこと、または異なるプログラムに対して異なる一時ディレクトリを使用することを許可しました。シングル/tmpはそれを提供しません(再び、名前空間などはありません)。また、考慮すべき多くの履歴(またはレガシー)もあります。
スティーブンキット

ユーザーごとが有効なポイントですが、そのために優れたデザインが使用さ~/tmpれる理由です。/tmpもちろん、これはまだ物理的な場所と同じかもしれません。
-MSalters

44

実際に/tmpは、ほとんど存在することが保証されています。ただし、たとえ存在する場合でも、一時ファイルをそこに置く必要があるわけではありません。

標準規約では使用することですTMPDIR環境変数を。存在する場合、一時ファイルのディレクトリを指します。存在しない場合は、一時ファイルをに入れます/tmp

シェルスクリプトでは"${TMPDIR:-/tmp}"、一時ファイルの場所として使用できます。これは、設定されている場合は値TMPDIR¹に展開され、/tmpそうでない場合は展開されます。またはTMPDIR、コマンドで、設定されていない場合に条件付きで設定できます

: "${TMPDIR:=/tmp}"

次に、内に一時ファイルを作成します"$TMPDIR"

どのアプリケーションでも/tmpまたはの下にファイルを作成できることに注意してください$TMPDIR。さらに、このディレクトリはユーザー間で共有される可能性があるため、ファイルを作成するときは権限に注意する必要があります。多くのシステム(Linux、* BSD)mktempには、正しいディレクトリに安全にファイルを作成するコマンドがあります。一般に、mktemp一時ファイルと一時ディレクトリの作成に使用することをお勧めします。特に、シンボリックリンク攻撃の可能性があるため、共有ディレクトリに安全にファイルを作成できないシェルスクリプトからです(mkdirエラーを正しく処理する場合は問題ありません)。

¹ および非空—変数が空の場合、とにかく使用できません。ファイル名が含まれていると想定される場合は、空または未設定の変数を同じ方法で処理することをお勧めします。


11
たぶん、ユーザーはファイル名の衝突を予期しなければならないことに言及できます。そのため、/ tmpにファイルを作成するIMOの唯一の推奨方法はコマンドでmktempあり、これは$ TMPDIR "も自動的に処理する必要があります
。– rudimeier

これはあなたが望む答えです。私は/ tmpはもちろんのこと/ binのないシステムを見てきました。
ジョシュア

1
また、A.10ディレクトリ構造とデバイスの状態:... /tmpディレクトリは、POSIX.1-2008で保持され、その可用性を前提とする履歴アプリケーションに対応しています。実装では、環境変数に適切なディレクトリ名を指定することをお勧めします。TMPDIRアプリケーションは、TMPDIR一時ファイルを作成するためのコンテンツを使用することをお勧めします。...
アンドリューヘンレ

3
それmktempがPOSIXにないことを見つけるのは残念ですが、すでにGNU(Linux)OpenBSDFreeBSDmacOSなどの最も一般的なオペレーティングシステムにあります。
フランクリンゆう

1
libcPerlPythonmktempなどの多くのスクリプト言語およびプログラミング言語で、このような関数を使用できることを追加する価値があるかもしれません。
ガウラフ

6

存在する可能性は非常に高いですが、別の理由を確認する必要があります。それが大きいことが保証されているわけではありません。多くのシステムで/tmpは、ディスクではなくRAMによってバックアップされ、数GBに制限される可能性があります。(Fedoraシステムでは、デフォルトではRAMの半分です。)そのため、存在だけでなく、そこに配置する予定のものを配置する余地があるかどうかを確認する必要があります。

大きなものがある場合は、を使用します/var/tmp/


2
特に、必要なスペースが正確にわからないので、先に進む前に使用可能なスペースをチェックするのが「Unixの方法」かどうかはわかりません。いずれにせよ、ファイルシステムがいっぱいになった場合に備えて、書き込みエラーを適切に処理する準備が必要です。そして、あなたがそれをしようとしている場合、偽陰性と陽性になりやすい事前チェックを行うことによって何が得られますか?
ネイト・エルドレッジ

2
失敗のケースをどれだけ優雅に処理できるかによって異なります。主なポイントは、/tmp大きなファイルを処理できると想定しないことです。中程度の速度のリンクを介した10GBのダウンロードだとしましょう。「Unix方式」であろうとなかろうと、機能しないという点で数時間を見つけるのはかなり悲惨です。
mattdm

1
@mattdm早期チェックは素晴らしいですが、失敗を処理する必要があります。ダウンロードの開始時に/ tmpに10 GBの空き容量がある場合がありますが、ダウンロードの実行中に別のユーザーが5 GBをそこにコピーします。それで?へえ。
ザンリンクス

絶対に!私はこれを失敗を処理しない言い訳とは言いません。
-mattdm

「何か大きなものがある場合」-/ tmpを使用し、必要に応じてOSを交換します。
UKMonkey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.