В какую папку мне писать для промежуточных файлов, как для разработчика?


17

Я начинаю писать несколько сценариев bash для моего проекта, и им нужно написать несколько промежуточных файлов или переменных.

Я хочу знать, к каким папкам я могу иметь доступ, когда кто-то запускает мой скрипт? Это обычная практика для использования /tmp/? Или я должен использовать что-то еще?

Ответы:


21

Я считаю документ Стандарт иерархии файловой системы бесценным при поиске этого материала.

Есть несколько вариантов,

  • / tmp - «непостоянные» временные файлы
  • / var / tmp - «постоянные» временные файлы
  • / var / cache - временные файлы данных приложения

Это действительно зависит от типа данных, которые вы храните.


лучше использовать то, что дает вам пользователь / окружение, и использовать только / tmp и т. д. как запасной вариант. (что сказал unix.stackexchange.com/a/79776/7784 )
Олуф Лоренцен

15

Если вам нужно написать некоторые временные файлы , которые только в прошлом, пока ваш сценарий или приложение запущено, используйте каталог указывает TMPDIRпеременную окружения, или , если эта переменная не определена, /tmp.

/tmpочищается во время загрузки в некоторых системах (иногда даже в ОЗУ, например, по умолчанию в Solaris и в некоторых установках Linux), поэтому его нельзя использовать для файлов, которые должны пережить сбой питания или перезагрузку. /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(см. Эту статью ). Хотя один ответ, цитирующий, также FHSимеет большое значение.
Карлос Кампдеррос

Почему вы инициализируете tmp_rootперед назначением? Разве это не было бы более естественным для unsetэтого?
10

@ l0b0 Либо будет работать (кроме как под set -u, но это редко). Его нужно (не) устанавливать в безопасное значение перед установкой ловушки, в случае, если скрипт будет убит сразу после установки ловушки.
Жиль "ТАК - перестань быть злым"

Я бы добавил, set -o errexitчто, если tmp_rootв среде уже установлен режим «только для чтения», он не разрушит неправильный каталог ...
l0b0

2

Просто чтобы дополнить ответы, которые уже были опубликованы до сих пор.

Существует также /dev/shmв некоторых дистрибутивах Linux, которые можно использовать для временного хранения. Это хранилище следует использовать только в том случае, если производительность файлового ввода-вывода является критическим фактором, определяющим /dev/shmиспользование tmpfsфайловой системы. Также его следует использовать для файлов и данных разумного размера. В tmpfsфайловой позволяет использовать в качестве системной памяти хранения , так что не является постоянной от загрузки к загрузке.

Есть хороший обзор всех вариантов, упомянутых здесь, в StackOverflow, а также в этом разделе вопросов и ответов под названием: / tmp vs. / dev / shm для временного хранения файлов в Linux? , Это хорошо описано в разделе вопросов и ответов SuperUser под названием: Когда я должен использовать / dev / shm / и когда я должен использовать / tmp? ,

Ссылки


0

Да, /tmpв основном для файлов, которые требуются временно. У / tmp есть залипший бит, который означает, что только владелец элемента, владелец каталога или суперпользователь может переименовывать или удалять файлы. многие программы используют это для создания файлов блокировки и для временного хранения данных. В некоторых дистрибутивах этот каталог очищается при загрузке или выключении.


1
Не все каталоги / tmp очищаются при загрузке. Например, установки по умолчанию в AIX этого не делают (а это UNIX и Linux, а не только Linux).
EightBitTony

Тем не менее, если он является резидентом «памяти», который, по-видимому, используется по умолчанию во многих случаях, он исчезает, когда система останавливается по любой причине.
MDPC
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.