У меня есть программа, которая должна создавать временные файлы. Написано для кластерных машин.
Если я сохранял эти файлы во системном временном каталоге (например:) /tmp
, некоторые пользователи жаловались на сбой программы, поскольку у них не было надлежащего доступа к / tmp. Но если я сохранил эти файлы в рабочем каталоге, эти пользователи также пожаловались, что не хотят видеть эти загадочные файлы.
Какой из них лучше? Должен ли я настаивать на том, что сохранение /tmp
является правильным подходом, и защищать любой сбой как «работающий по назначению» (т. Е. Спрашивать у своего администратора правильное разрешение / доступ)?
data
file-handling
SmallChess
источник
источник
/tmp
Unix-подобной системе, это неверно настроено. Суперпользователь должен сделать что-то вродеchmod 1777 /tmp
./tmp/
, который вы должны использовать вместо этого. Посмотрите ответы на некоторые вопросы;)Ответы:
Временные файлы должны храниться во временном каталоге операционной системы по нескольким причинам:
Операционная система позволяет очень легко создавать эти файлы, гарантируя, что их имена будут уникальными .
Большинство программ резервного копирования знает, какие каталоги содержат временные файлы, и пропускает их. Если вы используете текущий каталог, это может оказать существенное влияние на размер инкрементных резервных копий, если резервные копии выполняются часто.
Временный каталог может находиться на другом диске или в ОЗУ, что делает доступ для чтения и записи намного, намного быстрее .
Временные файлы часто удаляются во время перезагрузки (если они находятся на виртуальном диске, они просто теряются). Это снижает риск бесконечного роста, если ваше приложение не всегда правильно удаляет временные файлы (например, после сбоя).
Очистка временных файлов из рабочего каталога может легко стать грязной, если файлы хранятся вместе с файлами приложений и пользователей. Вы можете решить эту проблему, создав отдельный каталог в текущем каталоге, но это может привести к другой проблеме:
Длина пути может быть слишком большой на некоторых платформах. Например, в Windows ограничения пути для некоторых API, каркасов и приложений ужасны , что означает, что вы можете легко достичь такого предела, если текущий каталог уже находится глубоко в древовидной иерархии и имена ваших временных файлов слишком длинные.
На серверах отслеживание роста временного каталога часто выполняется сразу. Если вы используете другой каталог, он может не контролироваться, и мониторинг всего диска не поможет легко понять, что временные файлы занимают все больше места.
Что касается ошибок в доступе, убедитесь, что операционная система создала временный файл для вас. Операционная система может, например, знать, что для данного пользователя используется каталог, отличный от
/tmp
илиC:\Windows\temp
должен быть; таким образом, при непосредственном доступе к этим каталогам вы действительно можете столкнуться с ошибкой в доступе.Если вы получаете отказ в доступе даже при использовании вызова операционной системы, это просто означает, что машина была плохо настроена; это уже объяснил Blrfl . Системный администратор должен настроить машину; вам не нужно менять приложение.
Создание временных файлов является простым на многих языках. Несколько примеров:
Bash:
Python:
C #:
PHP:
Рубин:
Обратите внимание, что в некоторых случаях, например в PHP и Ruby, файл удаляется при закрытии дескриптора. Это дополнительное преимущество использования библиотек, связанных с языком / структурой.
источник
fopen("/tmp/mytmpfile", "w");
я должен сделать какой-то системный вызов для обработки временных файлов?tmpfile(3)
чтобы сгенерировать ваши временные файлы, или, по крайней мере, звонить,mktemp(3)
чтобы создавать имена файлов.Для этого есть стандарты, и лучшее, что вы можете сделать, это соответствовать им.
POSIX, за которой следуют практически все ОС, не относящиеся к мэйнфреймам, любого значения, с которым вы, вероятно, столкнетесь, имеет условия для создания временных файлов с уникальными именами в каталоге с использованием значений по умолчанию, которые могут быть переконфигурированы средой:
stdio.h
Заголовок C может дополнительно включатьP_tmpdir
макрос, который называет временный каталог системы.TMPDIR
является канонической переменной среды для изменения местоположения временных файлов. До POSIX, были и другие переменные , используемые, так что я , как правило, идут с первым из этого илиTMP
,TEMPDIR
иTEMP
что имеет значение, понтировавшего и использование системы по умолчанию , если ни один из них не существует.mkstemp()
иtempfile()
сгенерируют уникальные временные файлы.Если вашим пользователям отказывают в возможности создавать временные файлы, система либо неправильно настроена, либо администраторы не дают понять, какова их политика в отношении таких вещей. В этих случаях вы будете твердо уверены, что ваша программа соответствует общепринятому стандарту переносимости и что ее поведение можно изменить с помощью переменных среды, указанных в стандарте.
источник
P_tmpdir
не является частью,stdio.h
как определено в спецификации языка C. Это может быть определено POSIX или SVID.pam_tmpdir
- это устанавливаетTMPDIR
иTMP
будет отличаться для каждого пользователя, для надежности и конфиденциальности. Также полезно иметь возможность устанавливатьTMPDIR
для одной команды - если у вас есть обычный временный каталог в файловой системе RAM для скорости, вам может потребоваться сделать это для команд, которые генерируют огромные временные файлы (например, гигантскиеsort
). Не игнорируйте стандарты / соглашения, которые ожидают ваши пользователи!Каталог временных файлов сильно зависит от операционной системы / среды. Например, для обеспечения безопасности веб-сервер временная директория отделена от операционной системы.
Под ms-windows у каждого пользователя есть свой временный каталог.
Вы должны использовать createTempFile () для этого, если такая функция доступна.
источник
Предыдущие ответы, хотя и правильные, не подходят для большинства крупномасштабных компьютерных кластеров.
Компьютерные кластеры не всегда следуют стандартным соглашениям для машин, обычно по уважительным причинам, и нет смысла обсуждать это с системными администраторами.
Ваш текущий каталог ссылается на центральную файловую систему, доступ к которой осуществляется через сеть. Это не только медленно, но и создает нагрузку на систему для остальных пользователей, поэтому вам не следует использовать ее, если вы не пишете много, и вы можете восстановить ее в случае сбоя задания.
Вычислительные узлы имеют свой собственный жесткий диск, это самая быстрая из доступных файловых систем и то, что вам следует использовать. В документации кластера должно быть указано, что это, как правило
/scratch
,/tmp/[jobid]
или какая-то нестандартная переменная окружения ($SNIC_TMP
в одной из тех, которые я использую).Итак, я рекомендую сделать его настраиваемым пользователем. Значения по умолчанию могут быть первыми, к которым у вас есть доступ для записи:
$TMPDIR
tmpfile
/tmp
.
Но при таком подходе ожидайте низкий процент успеха и убедитесь, что выдается большое жирное предупреждение.
Изменить: я добавлю еще одну причину, чтобы заставить его быть установленным пользователем. Один из моих кластеров
$TMPDIR
настроен для/scratch
записи пользователем и находится на локальном жестком диске. Но в документации сказано, что все, что вы пишете вне,/scratch/[jobid]
может быть удалено в любой момент, даже в середине цикла. Так что, если вы будете следовать стандартам и доверять$TMPDIR
, вы столкнетесь со случайными сбоями, которые очень сложно отладить. Таким образом, вы можете принять$TMPDIR
, но не доверять этому.В некоторых других кластерах эта переменная настроена правильно, поэтому вы можете добавить опцию для явного доверия
$TMPDIR
, в противном случае выдает большое, жирное предупреждение.источник
Для многих приложений вам следует рассмотреть возможность размещения временных файлов в
$XDG_RUNTIME_DIR
или$XDG_CACHE_HOME
(другие каталоги XDG предназначены для не временных файлов). Инструкции по их вычислению, если они явно не передаются в среде, см. В спецификации XDG basedir или в библиотеке, которая уже реализует эту часть.Тем не менее, обратите внимание, что
$XDG_RUNTIME_DIR
это новое дополнение, и для старых систем не существует стандартного запасного варианта из-за проблем безопасности.Если ни один из них не подходит, то
/tmp
это правильное место. Вы никогда не должны предполагать, что текущий каталог доступен для записи.источник
Это больше похоже на альтернативу, но вы можете сразу отменить ссылку () на файл после fopen (). Это зависит от модели использования курса.
Отмена связывания файлов, если это возможно, помогает по нескольким причинам:
Файлы должны быть созданы в / tmp. Если у пользователя нет прав на создание файла, это означает, что система неправильно настроена.
Файлы не могут быть созданы в домашнем каталоге пользователей. Многие пользователи, такие как «nobody», «www-data» и многие другие, не имеют прав на запись в свои домашние каталоги, или они даже chroot () - ed. Обратите внимание, что даже в среде chroot / tmp все еще существует.
источник