Где я должен поместить кэш приложений для приложений на основе Unix?

10

Я создаю приложение командной строки, и мне нужно сохранить некоторые временные данные в файлы. Я не знаю, где соглашение о том, чтобы приложения хранили свой кеш на Unix-системах (в данном случае Ubuntu 12.0.4)?

дельфин
источник

Ответы:

12

«Системы на основе Unix» - это слишком общая категория, чтобы делать какие-либо общеприменимые определения, применимые ко всем системам на основе Unix. Проблема в том, что структура файловой системы (и «правильное» / «обычное» место для размещения вещей) настолько сильно различается между разными разновидностями «Unix» (если вы можете даже назвать это так), что вам в значительной степени придется справиться с этим на индивидуальной основе.

Несколько примеров:

  • В Ubuntu 64-битные библиотеки находятся в / usr / lib или / usr / lib / x86_64-linux /, а 32-битные библиотеки - в / usr / lib32
  • В Fedora 64-битные библиотеки находятся в / usr / lib64, а 32-битные библиотеки - в / usr / lib
  • В Fedora больше нет понятия / lib или / bin (это просто символические ссылки в эквивалентные каталоги / usr)
  • Большинство дистрибутивов Linux предпочитают устанавливать установленное пользователем программное обеспечение (то есть программное обеспечение, не предоставляемое менеджером пакетов) в / usr / local / (с lib, bin и т. Д., Var и т. Д. В / usr / local /)
  • Многие дистрибутивы Linux используют / var / cache для кеша, хотя, если он «временный» (не имеет значения, теряется ли он), его можно сохранить в / tmp
  • Некоторые приложения типа «приложение в папке» хранят все в подкаталоге / opt (особенно установщики clickwrap)
  • Некоторые приложения просто устанавливаются в подкаталог каталога пользователя ~ (обычно это / home / username)
  • В Solaris я видел, что / srv используется аналогично / opt, а иногда / srv - это www-root

Ответ заключается в том, что каноническое, социально приемлемое, хорошо интегрированное соглашение о том, где хранить что-либо в любой операционной системе, будь то дистрибутив Linux, BSD, Solaris, HP-UX и т. Д., Зависит от конкретных обстоятельств . В частности:

  • Как распределяется пакет?
  • Требуется ли пользователю root-доступ для его установки?
  • Зависит ли пакет или напрямую интегрируется с другими пакетами, уже имеющимися в системе, например, с плагином или надстройкой?
  • Будет ли пакет интегрирован в вышестоящие репозитории дистрибутива, чтобы пользователи могли использовать такую ​​команду apt-getили yumустановить ее напрямую, не загружая установщик с веб-сайта?
  • Будет ли программное обеспечение иметь отдельную конфигурацию для каждого отдельного пользователя, который управляет компьютером?
  • Будут ли в программном обеспечении глобальные параметры конфигурации, которые должен изменять только администратор (root)?
  • Должно ли программное обеспечение интегрироваться с системой init (например, для запуска при загрузке)?

На это нет однозначного ответа без учета всех факторов. Однако, в частности, для Ubuntu 12.04 , если вы встраиваете свой пакет в .debфайл для распространения в PPA или для отправки в собственные репозитории пакетов ( mainили universe) Ubuntu , я бы порекомендовал хранить кэш в /var/cache. Но это только для Ubuntu, и вы, конечно, не должны применять предположение, что все дистрибутивы или ОС на базе Unix сочтут это приемлемым.

Кроме того, если нет никаких преимуществ в сохранении данных кэша при загрузке системы, я думаю, что они также могут быть в / tmp.

Обратите внимание, что вы столкнетесь с этими проблемами соглашения о путях для каждого типа файлов, которые использует ваша программа: общие данные, исполняемые файлы, библиотеки, файлы справки, изображения, звук, веб-страницы и так далее. Поэтому мне интересно, если вы спрашиваете о файлах кэша, как вы планируете обрабатывать файлы других типов. Вы просто делаете наивные предположения и надеетесь, что никто не согласится с вами? Если вы не читали никаких документов или стандартов по Ubuntu, в которых предлагалось бы их разместить, плохая идея просто предполагать одно или другое. Например, всегда вставлять библиотеки в / usr / lib может быть ошибкой, так как в зависимости от ситуации они могут находиться в другом месте.

Кроме того, как разработчик программного обеспечения, я думаю, что самое ответственное, что нужно сделать, это позволить конечному пользователю решить, куда поместить свои файлы. Вы можете установить значения по умолчанию, но пользователи (и дистрибьюторы) могут и будут настраивать сборку под свой дистрибутив.

Самый простой способ сделать это - создать свою программу с использованием GNU Autoconf . Autoconf - это система сборки, в которой пользователь может передавать аргументы командной строки в сценарий сборки, чтобы изменить пути различных «типов каталогов» по ​​умолчанию. Почти в каждом дистрибутиве есть скрипт сборки для каждого пакета Autoconf, который устанавливает дистрибутивные обычные каталоги для каждого типа. Они даже специально имеют тип каталога для кеша: sharedstatedir .

allquixotic
источник
Во-первых, большое спасибо за ваш ответ, действительно очень подробный. Природа приложения (ruby) заключается в кэшировании вызовов API, которые обслуживают статический контент. Это приложение ruby, и из того, что я прочитал в вашем месте ответов, мой дисковый кеш будет /tmpпапкой. Ответы на ваши вопросы будут (скачать, нет, нет, нет, нет, нет, нет). Наверное, кажется нормальным для большинства людей сделать вывод, /tmpно я новичок в системах Unix, и соглашения на основе Ubuntu OS мне незнакомы. Это открывает для gem интересную идею разрешить независимое кэширование диска (независимость от пользователя). Спасибо, +1 от меня.
Дельфин
Обратите внимание, что система ruby ​​gem, установленная в большинстве дистрибутивов Linux, имеет очень специфический каталог, в котором гемы устанавливаются gemинструментом. Однако, вероятно, было бы неуместно создавать файлы во время выполнения в том же каталоге, куда ваше приложение загружается гемом. С другой стороны, если вы запускаете приложение как пользователь, вам нужен каталог, доступный для чтения и записи для пользователей , и это означает либо изменение разрешений (что требует еще большей работы по интеграции системы во время установки, такой как создание группы). и т. д.) или используя глобальный каталог для чтения и записи, например / tmp.
allquixotic
Вы не можете и не должны записать данные /usr, /libили /binиз приложения.
Ctrl-Alt-Delor