对于基于Unix的应用程序,应将应用程序缓存放在哪里?


10

我正在构建命令行应用程序,并且需要将一些临时数据保存到文件中。我不知道应用程序在基于Unix的系统(在本例中为Ubuntu 12.0.4)上存储缓存的约定在哪里?

Answers:


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 /中安装用户安装的软件(即程序包管理器未提供的软件)(在/ usr / local /中使用lib,bin等,var等)。
  • 许多Linux发行版都使用/ var / cache进行缓存,尽管如果它是“瞬态的”(不要丢失),则可以将其存储在/ tmp中
  • 一些“文件夹中的应用程序”类型的应用程序将所有内容存储在/ opt的子目录中(尤其是clickwrap安装程序)
  • 有些应用程序只是安装到用户〜目录的子目录中(通常是/ home / username)
  • 在Solaris上,我看到/ srv的用法与/ opt相似,或者有时/ srv是www-root

答案是,关于在任何操作系统上存储任何内容的规范的,社会上可接受的,高度集成的约定,无论是Linux,BSD,Solaris,HP-UX等的发行版,都取决于实际情况。特别:

  • 包裹如何分配?
  • 用户是否需要root用户权限才能安装它?
  • 程序包是否依赖于系统上已有的其他程序包或与之直接集成,例如插件或附加程序?
  • 软件包是否将被集成到发行版的上游存储库中,以便用户可以使用类似的命令apt-getyum直接安装它,而无需从网站上下载安装程序?
  • 对于操作计算机的每个不同用户,软件是否将具有单独的配置?
  • 该软件是否具有只能由管理员(root)修改的全局配置设置?
  • 该软件是否需要与init系统集成(例如,在启动时启动)?

如果不考虑所有因素,就没有直接的答案。但是,特别是对于Ubuntu 12.04,如果要将软件包构建.deb到要在PPA中分发的文件中,或者要提交给Ubuntu自己的软件包存储库(mainuniverse),我建议将缓存存储在中/var/cache。但这仅适用于Ubuntu,您当然不应该假设每个发行版或基于Unix的操作系统都将其视为可接受的假设。

此外,如果跨系统引导保存缓存数据没有任何优势,我认为它也可能属于/ tmp。

请注意,您将遇到程序使用的每种文件类型的这些路径约定问题:共享数据,可执行文件,库,帮助文件,图像,声音,网页等等。因此,我想知道,如果您要询问缓存文件,那么您打算如何处理其他文件类型。您是否只是在做天真的假设,并希望没有人反对您?如果您还没有阅读任何建议将它们放在哪里的Ubuntu文档或标准,那么假设一件事情还是另一件事是个坏主意。例如,始终将库粘贴在/ usr / lib中可能是一个错误,因为取决于它们可能属于其他位置的情况。

另外,作为软件开发人员,我认为最负责任的事情是允许最终用户决定将文件放置在何处。您可以设置默认值,但是用户(和分发者)可以并且将自定义构建以适合其发行版。

最简单的方法是使用GNU Autoconf构建程序。Autoconf是一个构建系统,用户可以在其中将命令行参数传递给构建脚本,以更改各种“目录类型”的路径,使其与默认值不同。几乎每个发行版都为每个Autoconf包提供了一个构建脚本,该脚本为每种类型设置了适合发行版的常规目录。它们甚至专门具有用于缓存的目录类型:sharedstatedir


首先非常感谢您的回答,确实非常详细。应用程序(红宝石)的性质是缓存可提供静态内容的API调用。这是ruby应用程序,从我在您的答案中阅读的磁盘缓存中可以看到/tmp文件夹。您的问题的答案将是(下载,不,不,不,不,不,不)。对于大多数人来说,似乎很正常的结论是,/tmp但是我对UNIX系统是陌生的,而基于ubuntu os的约定对我来说并不陌生。这为gem提供了一个有趣的想法,以允许使用不可知的磁盘缓存(用户不可知)。谢谢,我+1。
Dolphin 2012年

请注意,大多数Linux发行版中安装的ruby gem系统具有一个非常特定的目录,该gem工具在该目录中安装了gem 。但是,可能不太适合在运行时在gem所下载的应用程序所在的目录中创建文件。另一方面,如果您以用户身份运行应用程序,则需要一个对用户可读写的目录,这意味着可以更改权限(这需要在安装时进行更多的系统集成工作,例如创建组)等等),或使用全局读写目录,例如/ tmp。
allquixotic 2012年

你不能,不应写入数据/usr/lib或者/bin从您的应用程序。
ctrl-alt-delor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.