開発者として、中間ファイル用にどのフォルダーに書き込む必要がありますか?


17

私は自分のプロジェクト用にいくつかのbashスクリプトを書き始めており、それらにはいくつかの中間ファイルまたは変数を書き込む必要があります。

誰かがスクリプトを実行したときに、どのフォルダーにアクセスできるかを確認できますか?使用するのは一般的な習慣/tmp/ですか?それとも、何か他のものを使用する必要がありますか?

回答:


21

このようなものを探すとき、Filesystem Hierarchy Standardドキュメントは非常に貴重だと思います。

いくつかのオプションがありますが、

  • / tmp-「非永続的な」一時ファイル
  • / var / tmp-「永続的な」一時ファイル
  • / var / cache-「アプリケーション」一時データファイル

保存するデータの種類によって異なります。


ユーザー/環境が提供するものをよりよく使用し、フォールバックとして/ tmpなどのみを使用します。(unix.stackexchange.com/a/79776/7784が言ったこと)
Oluf Lorenzen

15

スクリプトまたはアプリケーションが実行されている間だけ持続する一時ファイルを作成する必要がある場合は、TMPDIR環境変数で指定されたディレクトリを使用するか、その変数が定義されていない場合は、を使用します/tmp

/tmp一部のシステムではブート時にクリアされます(たとえば、Solarisや一部のLinuxインストールではデフォルトでRAMにあることもあります)。そのため、停電や再起動に耐えなければならないファイルには使用できません。/var/tmp再起動後も存続する必要があるファイルに使用できますが、システム管理者によって適宜削除される場合があります。アプリケーションのニーズが永続的にファイルを保存する場合は、ユーザのホームディレクトリ内(のどこかにそれらを書く~/.programmingnoobsapp~/.cache/programmingnoobsapp)、または下/var/lib/programmingnoobsapp/var/cache/programmingnoobsapp

これ/tmpはすべてのユーザー間で共有されるため、そこでファイルを作成する際には注意が必要です。まだ存在しないファイル名を選択する必要があります。また、別のプロセスが別のアクセス許可を使用してファイルを作成する競合状態を許可しないように注意する必要があります。別のユーザーとして実行されている場合、プロセスのデータにアクセスして変更できます)。使用mktemp中のファイルを作成するコマンドを/tmp/var/tmp。デフォルトでmktempは、にファイルを作成します。設定されてい$TMPDIRない/tmp場合TMPDIRは、通常は適切な場所です。複数の一時ファイルを使用する必要がある場合、または単一の一時ファイルが必要な場合でも、すべての一時ファイル用のディレクトリを作成することをお勧めしますmktemp -d スクリプトの最後で削除します。

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

mktempの場合、スクリプトの最後で一時ファイルを削除しません。古いファイルを自動的に削除するtmpwatch cronジョブがあります。ほとんどの場合、私は中間ファイルを読み込まず、システムはそれ自体でファイルを削除します。ただし、スクリプトに問題が発生した場合、デバッグを容易にするためにすべての中間ファイルが用意されています。
エモリー

1
+1 mktemp。私にとってこれは正しい答えです。一時ファイルを安全に作成するタスクを委任しますmktempこの記事を参照)。を引用する1つの答えにFHSも大きな価値があります。
カルロスキャンデロス

tmp_root割り当てる前に初期化するのはなぜですか?それはより自然ではunsetないでしょうか?
l0b0

@ l0b0どちらでも機能します(アンダーを除くがset -u、それは一般的ではありません)。トラップを設定した直後にスクリプトが強制終了された場合に備えて、トラップを設定する前に安全な値に設定する必要があります。
ジル 'SO-悪であるのをやめる'

環境で既に読み取り専用に設定されset -o errexitている場合tmp_root、間違ったディレクトリが破壊されないように追加します
...-l0b0

2

これまでに既に投稿された回答を補完するためだけに。

あり、/dev/shm一時的に記憶するために使用することができ、いくつかのLinuxディストリビューション。このストレージは、ファイルI / Oのパフォーマンスがファイルシステム/dev/shmを使用する重要な要素である場合にのみ使用してくださいtmpfs。また、適度なサイズのファイルとデータにも使用する必要があります。tmpfsそれはブートから起動するように永続的ではありませんので、ファイルシステムは、ストレージなどのシステムRAMを使用しています。

StackOverflowで説明されているすべての選択肢の概要は、Linuxでの一時ファイルストレージの/ tmp vs. / dev / shmというタイトルのこのQ&Aにもあります。。このスーパーユーザーに関するQ&A:/ dev / shm /をいつ使用し、/ tmpをいつ使用する必要がありますか?

参照資料


0

はい、/tmp主に一時的に必要なファイル用です。/ tmpにはスティッキービットがあります。これは、アイテムの所有者、ディレクトリの所有者、またはスーパーユーザーのみがファイルの名前を変更または削除できることを意味します。多くのプログラムはこれを使用してロックファイルを作成し、データを一時的に保存します。一部のディストリビューションでは、このディレクトリはブートアップまたはシャットダウン時に消去されます。


1
ブート時にすべての/ tmpディレクトリがクリアされるわけではありません。たとえば、デフォルトのAIXインストールはそうではありません(これはLinuxだけでなくUNIXとLinuxです)。
EightBitTony

ただし、多くの場合デフォルトであると思われる「メモリ」常駐である場合、何らかの理由でシステムが停止すると消えます。
mdpc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.