Как долго сохраняются временные файлы, созданные с помощью mktemp?

20

Мне было интересно, как долго работают временные файлы, созданные с помощью mktemp. Мне кажется странным полагаться на файл, который может исчезнуть в любое время. Я на Ubuntu, если это имеет значение.

MYV
источник

Ответы:

17

А? От man mktemp:

DESCRIPTION
   Create  a  temporary  file  or directory, safely, and
   print its name.  TEMPLATE must  contain  at  least  3
   consecutive  `X's  in last component.  If TEMPLATE is
   not specified, use tmp.XXXXXXXXXX,  and  --tmpdir  is
   implied.   Files  are  created  u+rw, and directories
   u+rwx, minus umask restrictions.

mktempпросто добавляет случайную строку, чтобы создать уникальное имя файла. Никто не собирается удалять его автоматически.


Поскольку, кажется, есть немного аргументов, давайте углубимся в некоторые детали. mktempСтраница man's утверждает, что

если ШАБЛОН не указан, --tmpdirпредполагается, если --tmpdirне указан, /tmpпредполагается.

Это означает, что простой запуск mktempсоздаст файл с именем tmp.RANDOM_STRING в каталоге / tmp . Так что да, запуск mktempбез параметров создаст файл, который будет очищен вместе со всем остальным в /tmpзависимости от системы. Для таких файлов $TMPTIMEбудет важна переменная, как объяснено в ответе Криса ниже. Для многих дистрибутивов значение по умолчанию очищает /tmpкаждую загрузку, потому что $TMPTIMEустановлено в 0. В большинстве (если не во всех) дистрибутивах это устанавливается в файле /etc/default/rcS:

$ grep TMPTIME /etc/default/rcS
TMPTIME=0

Теперь, если вы делаете указать ШАБЛОН, например , mktemp fooXXXто файл с именем fooXXXсоздается в текущем каталоге , где XXXзаменяется тремя случайными символами. Этот файл никогда не будет удален, если вы специально не сделаете это. Только файлы в «официальных» временных каталогах, такие как /tmpкогда-либо автоматически удаляемые системой, нет никакого волшебного бита, который вы можете установить, который указывает временный файл, файлы снаружи /tmpи тому подобное не удаляются автоматически.

Чтобы ответить на ваш главный вопрос, конечно, странно зависеть от файла, который может исчезнуть, поэтому люди не зависят от файлов tmp, они созданы для временного хранения данных, и тогда мы можем забыть о них. Существует много способов создания постоянного файла со случайным именем. Например:

echo "foo" > $RANDOM.txt
echo "foo" > `mktemp fooXXX.txt`
echo "foo" > $$.txt
terdon
источник
2
Это не отвечает на мой вопрос. Он говорит, что создает «временный» файл и не дает информации о том, как долго он длится. Так это длится вечно? Каталог tmp загружается при загрузке системы?
MYV
@ Максим смотрите обновленный ответ. Кроме того, ваш вопрос не задавался, когда tmpкаталог очищается, а когда файлы, созданные с помощью mktemp, удаляются. Как видите, эти два понятия не обязательно связаны между собой :).
тердон
6

Помните, что временные файлы могут быть удалены во время загрузки системы или в соответствии с TMPTIME. Пожалуйста, посмотрите, что у вас есть /etc/cron.daily/tmpwatch.

/var/tmp/с другой стороны, обычно невосприимчив к tmpwatch.

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

Вам не нужно создавать временный файл в /tmp

Крис
источник
Видя, что mktempможет быть запущен в любом каталоге и просто создает произвольное имя файла, я не вижу, как это связано с чем-либо tmpwatch.
Тердон
1
По умолчанию mktempсоздает файлы в /tmp/.
Крис
только если вы не дадите ШАБЛОН, посмотрите мой обновленный ответ.
тердон
1

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

EBGreen
источник
Разве некоторые системы не используют TMPTIME?
скромно
@demure yes, но только для очистки /tmpили других каталогов tmp. Он не будет просто случайным образом удалять созданные пользователем файлы.
тердон
По умолчанию mktempсоздает файлы в /tmp/.
Крис