Wo soll ich meinen Anwendungscache für Unix-basierte Apps ablegen?

10

Ich erstelle eine Befehlszeilenanwendung und muss einige temporäre Daten in Dateien speichern. Ich weiß nicht, wo die Konvention für Anwendungen ist, ihren Cache auf Unix-basierten Systemen zu speichern (in diesem Fall Ubuntu 12.0.4).

Delfin
quelle

Antworten:

12

"Unix-basierte Systeme" ist eine viel zu allgemeine Kategorie, um eine allgemein gültige Bestimmung zu treffen, die für alle Unix-basierten Systeme gilt. Das Problem ist, dass die Dateisystemstruktur (und der "richtige" / "konventionelle" Ort, an dem Dinge abgelegt werden sollen) sich zwischen den verschiedenen Varianten von "Unix" (wenn man es überhaupt so nennen kann) so stark unterscheidet, dass man so ziemlich damit umgehen muss von Fall zu Fall.

Einige Beispiele:

  • Unter Ubuntu gehen 64-Bit-Bibliotheken in / usr / lib oder / usr / lib / x86_64-linux / und 32-Bit-Bibliotheken in / usr / lib32
  • Unter Fedora gehen 64-Bit-Bibliotheken in / usr / lib64 und 32-Bit-Bibliotheken in / usr / lib
  • Fedora hat keine Ahnung mehr von / lib oder / bin (sie sind nur Symlinks zu den entsprechenden / usr-Verzeichnissen).
  • Die meisten Linux- Distributionen bevorzugen die Installation von vom Benutzer installierter Software (dh Software, die nicht vom Paketmanager bereitgestellt wird) in / usr / local / (mit lib, bin usw., var usw. in / usr / local /).
  • Viele Linux-Distributionen verwenden / var / cache für den Cache. Wenn es jedoch "vorübergehend" ist (egal, ob es verloren geht), kann es in / tmp gespeichert werden
  • Einige Anwendungen vom Typ "App in einem Ordner" speichern alles in einem Unterverzeichnis von / opt (insbesondere Clickwrap-Installationsprogramme).
  • Einige Apps werden einfach in einem Unterverzeichnis des ~ -Verzeichnisses des Benutzers installiert (normalerweise / home / username).
  • Unter Solaris habe ich gesehen, dass / srv ähnlich wie / opt verwendet wird, oder manchmal ist / srv die WWW-Wurzel

Die Antwort ist, dass die kanonische, sozial verträgliche, gut integrierte Konvention für das Speichern von Inhalten auf jedem Betriebssystem, unabhängig davon, ob es sich um eine Distribution von Linux, BSD, Solaris, HP-UX usw. handelt, von den genauen Umständen abhängt . Speziell:

  • Wie ist das Paket verteilt?
  • Benötigt der Benutzer Root-Zugriff, um es zu installieren?
  • Hängt das Paket von anderen bereits auf dem System vorhandenen Paketen ab oder lässt sich direkt in diese integrieren, z. B. ein Plugin oder Add-On?
  • Wird das Paket in die Upstream-Repositorys der Distribution integriert, sodass Benutzer einen Befehl wie apt-getoder yumdirekt installieren können, ohne ein Installationsprogramm von einer Website herunterladen zu müssen?
  • Wird die Software für jeden Benutzer, der den Computer bedient, eine separate Konfiguration haben?
  • Verfügt die Software über globale Konfigurationseinstellungen, die nur vom Administrator (root) geändert werden können?
  • Muss die Software in das Init-System integriert werden (z. B. um beim Booten zu starten)?

Es gibt keine klare Antwort darauf, ohne alle Faktoren zu berücksichtigen. Insbesondere für Ubuntu 12.04 würde ich empfehlen, den Cache zu speichern , wenn Sie Ihr Paket in eine .debDatei einbauen, die in einer PPA verteilt werden soll, oder wenn Sie es an Ubuntus eigene Paket-Repositores ( mainoder universe) senden möchten /var/cache. Dies gilt jedoch nur für Ubuntu, und Sie sollten auf keinen Fall davon ausgehen, dass jede Distribution oder jedes Unix-basierte Betriebssystem dies für akzeptabel hält.

Wenn das Speichern der Cache-Daten über Systemstarts hinweg keine Vorteile bietet, könnte dies auch zu / tmp gehören.

Beachten Sie, dass diese Probleme mit der Pfadkonvention für jeden Dateityp auftreten, den Ihr Programm verwendet: freigegebene Daten, ausführbare Dateien, Bibliotheken, Hilfedateien, Bilder, Sound, Webseiten usw. Ich muss mich also fragen, wenn Sie nach Cache-Dateien fragen, wie Sie mit den anderen Dateitypen umgehen möchten. Machen Sie nur naive Annahmen und hoffen, dass niemand mit Ihnen nicht einverstanden ist? Wenn Sie keine Ubuntu-Dokumente oder -Standards gelesen haben, in denen vorgeschlagen wird, wo sie abgelegt werden sollen, ist es eine schlechte Idee, nur die eine oder andere Sache anzunehmen. Zum Beispiel könnte es ein Fehler sein, Bibliotheken immer in / usr / lib zu stecken, da sie von der Situation abhängen, in die sie möglicherweise anderswo gehören.

Als Softwareentwickler ist es meiner Meinung nach am verantwortungsvollsten, dem Endbenutzer zu ermöglichen, zu entscheiden, wo seine Dateien abgelegt werden sollen. Sie können Standardeinstellungen festlegen, aber Benutzer (und Distributoren) können und werden den Build an ihre Distribution anpassen.

Der einfachste Weg, dies zu tun, besteht darin, Ihr Programm mit GNU Autoconf zu erstellen . Autoconf ist ein Build-System, bei dem der Benutzer Befehlszeilenargumente an das Build-Skript übergeben kann, um die Pfade der verschiedenen "Verzeichnistypen" von den Standardeinstellungen zu ändern. Fast jede Distribution verfügt über ein Build-Skript für jedes Autoconf-Paket, das die für die Distribution geeigneten herkömmlichen Verzeichnisse für jeden Typ festlegt. Sie haben sogar speziell einen Verzeichnis-Typ für den Cache: sharedstatedir .

allquixotic
quelle
Zunächst vielen Dank für Ihre Antwort, in der Tat sehr detailliert. Die Art der Anwendung (Ruby) besteht darin, API-Aufrufe zwischenzuspeichern, die statischen Inhalt bereitstellen. Dies ist eine Ruby-Anwendung, und von dem, was ich an Ihrer Antwortstelle für meinen Festplatten-Cache gelesen habe, wäre /tmpOrdner. Antworten auf Ihre Fragen wären (Download, nein, nein, nein, nein, nein, nein). Wahrscheinlich scheint es für die meisten Leute normal zu sein, /tmpaber ich bin neu in Unix-Systemen und Ubuntu-basierte Konventionen sind mir unbekannt. Dies eröffnet Gem eine interessante Idee, um das Agnostic Disk Caching (User Agnostic) zu ermöglichen. Danke, +1 von mir.
Dolphin
Beachten Sie, dass das Ruby Gem-System, wie es in den meisten Linux-Distributionen installiert ist, ein sehr spezifisches Verzeichnis hat, in dem die Gems vom gemTool installiert werden . Es wäre jedoch wahrscheinlich nicht angebracht, Dateien zur Laufzeit in demselben Verzeichnis zu erstellen, in das Ihre Anwendung vom Gem heruntergeladen wird. Wenn Sie die App jedoch als Benutzer ausführen, benötigen Sie ein Verzeichnis, das für Benutzer schreibgeschützt ist. Dies bedeutet , dass Sie entweder die Berechtigungen ändern müssen (was zur Installationszeit noch mehr Systemintegrationsarbeit erfordert, z. B. das Erstellen einer Gruppe) usw.) oder unter Verwendung eines globalen Lese- / Schreibverzeichnisses, z. B. / tmp.
Allquixotic
Sie können nicht, und sollen nicht Daten schreiben /usr, /liboder /binin Ihrer Anwendung.
Strg-Alt-Delor