Мне было интересно, как долго сохраняются временные файлы, созданные с помощью mktemp. Мне кажется странным полагаться на файл, который может исчезнуть в любое время. Я на Ubuntu, если это имеет значение.
3 ответа
А? От 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
гласит, что
если TEMPLATE не указан, предполагается
--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
Помните, что временные файлы могут быть удалены во время загрузки системы или в соответствии с TMPTIME. Пожалуйста, посмотрите, что у вас есть в /etc/cron.daily/tmpwatch
.
/var/tmp/
с другой стороны, обычно невосприимчив к tmpwatch
.
Временные файлы создаются в течение (обычно) короткого периода времени. У них есть временное имя, поэтому выполнить атаку по времени нелегко, и обычно они удаляются, когда они больше не нужны программе. Обычно ваш скрипт хранит этот файл в течение очень короткого периода времени, обычно обрабатывая какой-то текст или другие файлы, и удаляет его, как только он не нужен. Если ваш сценарий потерпит крах, то вам также понадобятся процедуры поддержки папок /tmp (если вы решили их туда поместить).
Вам не нужно создавать временный файл в /tmp
Временные файлы не исчезают сами по себе. Они называются временными файлами просто потому, что в вашем скрипте или сеансе или где бы вы их не создавали, вы должны удалить их, когда закончите. Или оставьте их лежать, если это ваше дело. mktemp существует исключительно для того, чтобы вы могли создать файл с уникальным именем, чтобы он не перезаписывал существующий файл.