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

42

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

Ayush
источник
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/.

mattdm
источник
2
Я не уверен, если это «способ Unix», чтобы проверить доступное пространство, прежде чем продолжить, тем более, что не всегда точно известно, сколько места вам понадобится. В любом случае вы должны быть готовы корректно обработать ошибку записи на случай, если файловая система заполнится; и если вы собираетесь это сделать, что вы получите, сделав предварительную проверку, которая будет склонна к ложным негативам и позитивам?
Нейт
2
Зависит от того, насколько изящно вы справитесь со случаем неудачи, я полагаю. Главное не предполагать, что /tmpможно обрабатывать большие файлы. Допустим, это загрузка 10 ГБ по ссылке с умеренной скоростью. «Unix way» или нет, довольно печально узнать несколько часов, что это не сработает.
mattdm
1
@mattdm Ранняя проверка - это хорошо, но с ошибкой нужно справиться. Может быть, / tmp действительно имеет 10 ГБ, когда начинается загрузка, но другой пользователь копирует туда 5 ГБ, пока идет загрузка. Что теперь? Хех.
Zan Lynx
Определенно! Я не имею в виду это как предлог, чтобы не справиться с неудачей.
mattdm
«Если у вас есть что-то большое» - используйте / tmp и дайте ОС поменяться местами, если это необходимо.
UKMonkey