web-dev-qa-db-ja.com

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

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

誰かが私のスクリプトを実行したときに、どのフォルダに確実にアクセスできるか知りたいですか? /tmp/を使用するのが一般的な方法ですか?それとも私は何か他のものを使うべきですか?

17

ファイルシステム階層標準ドキュメント このようなものを探すときに非常に貴重だと思います。

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

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

それは本当にあなたが保存しているデータの種類に依存します。

21
EightBitTony

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

/tmpは、一部のシステムでは起動時にクリアされるため(Solarisや一部のLinuxインストールでは、デフォルトでRAMにある場合もあります)、停電や再起動に耐える必要のあるファイルには使用できません。 /var/tmpは、再起動後も存続する必要があるファイルに使用できますが、システム管理者によって随時クリーンアップされる場合があります。アプリケーションでファイルを永続的に保存する必要がある場合は、ユーザーのホームディレクトリ(~/.programmingnoobsappまたは~/.cache/programmingnoobsapp)または/var/lib/programmingnoobsappまたは/var/cache/programmingnoobsappの下にファイルを書き込みます。

/tmpはすべてのユーザー間で共有されるため、そこでファイルを作成する際には注意が必要です。まだ存在しないファイル名を選択する必要があります。また、別のプロセスが異なるアクセス許可でファイルを作成する競合状態を許可しないように注意する必要があります。これは、セキュリティホールになる可能性があります(他のプロセスの場合)。が別のユーザーとして実行されている場合、プロセスのデータにアクセスして変更する可能性があります)。 mktemp コマンドを使用して、/tmpまたは/var/tmpにファイルを作成します。デフォルトでは、mktemp$TMPDIRにファイルを作成し、TMPDIRが設定されていない場合は/tmpを作成します。これは通常適切な場所です。複数の一時ファイルを使用する必要がある場合、または単一の一時ファイルが必要な場合でも、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
…

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

もあります /dev/shm一時ストレージに使用できる一部のLinuxディストリビューション。このストレージは、ファイルI/Oのパフォーマンスが/dev/shmtmpfsファイルシステムを利用します。また、適度なサイズのファイルとデータに使用する必要があります。 tmpfsファイルシステムは、システムRAMをストレージとして使用するため、ブート間で永続的ではありません。

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

参考文献

2
slm

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

0
Raza