/ tmp гарантированно существует?


42

Нужно ли проверять и создавать /tmpперед записью в файл внутри него? Предположим, что никто не бежал, sudo rm -rf /tmpпотому что это очень редкий случай


16
Что вы подразумеваете под «гарантированным»? FHS требует этого, так что любой FHS-совместимый дистрибутив будет иметь его. Однако есть много специальных дистрибутивов, которые не соответствуют FHS. Конечно, можно создать дистрибутив Unix / Linux без / tmp, но необходимость заботиться об этом полностью зависит от того, заботитесь ли вы о поддержке этих систем.
Ли Райан

1
Почему бы не создать свой собственный временный каталог и удалить его, когда вы закончите с ним, вместо того чтобы полагаться на следующую перезагрузку для очистки?
WGroleau

4
@WGroleau Я не знаю об OP, но в сценариях, которые я пишу для своей собственной системы, я обычно помещаю временные файлы в подкаталог /tmp(созданный с помощью mktemp), а затем удаляю этот подкаталог при выходе. Большая часть моей системы монтируется только для чтения, и это избавляет меня от необходимости помнить cdо доступном для записи каталоге
Fox

1
@WGroleau Я не полагаюсь на перезагрузки, чтобы убрать это. как mktempвыглядит действительно здорово, I'l , вероятно , закончится с помощью этого.
Ayush

7
@jamesqf Да, перезагрузка не требуется, чтобы очистить /tmp. Однако, наоборот, это разрешено , и, по-видимому, WGroleau слишком далеко ушел от этого. Мой /tmpявляется tmpfsпроводятся в оперативной памяти, так что он очищен от остановки. Тем не менее, это просто деталь системы, которая не гарантируется FHS. Так что, к оригинальному комментарию, глупо полагаться на наличие или отсутствие чего-либо /tmpмежду ботинками.
underscore_d

Ответы:


60

Существующие мандаты FHS/tmp , как и POSIX , позволяют вам полагаться на его присутствие (по крайней мере, на совместимых системах; но на самом деле это гарантированно присутствует в Unix-подобных системах). Но вы не должны: системный администратор или пользователь может предпочесть другие места для временных файлов. См. Поиск правильного каталога tmp на нескольких платформах для более подробной информации.


Это конечно неудача проекта. /tmpэто имя. $TMPDIRэто другое имя. Если вы не можете рассчитывать на /tmpто, чтобы быть правильным именем временного каталога, почему вы можете рассчитывать на $TMPDIRто, чтобы быть именем правильной переменной среды? Почему я не должен проверять, $TMPDIRVARчтобы получить имя этой переменной? Достаточно одного уровня косвенности, и /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
Возможно, вы могли бы упомянуть, что пользователи должны ожидать столкновения имен файлов. Поэтому IMO единственный рекомендуемый способ создания файлов в / tmp - это команда, которая mktempтакже должна автоматически обрабатывать $ TMPDIR.
rudimeier

Это ответ, который вы хотите. Я видел системы без / bin, не говоря уже о / tmp.
Джошуа

1
Кроме того, A.10 Структура каталога и устройства гласят: ... /tmpКаталог сохраняется в POSIX.1-2008 для поддержки исторических приложений, предполагающих его доступность. Реализации рекомендуется предоставлять подходящие имена каталогов в переменной среды, TMPDIRа приложениям рекомендуется использовать содержимое TMPDIRдля создания временных файлов. ...
Эндрю Хенле

3
Просто грустно видеть, что mktempэто не в POSIX, хотя это уже в большинстве популярных операционных систем, таких как GNU (Linux) , OpenBSD , FreeBSD и macOS .
Франклин Ю

1
Возможно, стоит добавить, что mktempподобные функции доступны во многих языках сценариев и программирования, таких как libc , Perl и Python .
Гаурав

6

Хотя он, скорее всего, существует, вы должны проверить по другой причине: он не гарантированно будет большим . Во многих системах /tmpподдерживается оперативная память, а не диск, и, вероятно, будет ограничено несколькими ГБ. (В системах Fedora по умолчанию это половина ОЗУ.) Итак, вы должны проверить не только на существование, но и на то, есть ли место для размещения того, что вы намереваетесь поместить туда.

Если у вас есть что-то большое, используйте /var/tmp/.


2
Я не уверен, если это «способ Unix», чтобы проверить доступное пространство, прежде чем продолжить, тем более, что не всегда точно известно, сколько места вам понадобится. В любом случае вы должны быть готовы корректно обработать ошибку записи на случай, если файловая система заполнится; и если вы собираетесь это сделать, что вы получите, сделав предварительную проверку, которая будет склонна к ложным негативам и позитивам?
Нейт

2
Зависит от того, насколько изящно вы справитесь со случаем неудачи, я полагаю. Главное не предполагать, что /tmpможно обрабатывать большие файлы. Допустим, это загрузка 10 ГБ по ссылке с умеренной скоростью. «Unix way» или нет, довольно печально узнать несколько часов, что это не сработает.
mattdm

1
@mattdm Ранняя проверка - это хорошо, но с ошибкой нужно справиться. Может быть, / tmp действительно имеет 10 ГБ, когда начинается загрузка, но другой пользователь копирует туда 5 ГБ, пока идет загрузка. Что теперь? Хех.
Zan Lynx

Определенно! Я не имею в виду это как предлог, чтобы не справиться с неудачей.
mattdm

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