Où dois-je placer le cache de mon application pour les applications basées sur Unix?


10

Je crée une application en ligne de commande et j'ai besoin d'enregistrer des données temporaires dans des fichiers. Je ne sais pas où est la convention pour que les applications stockent leur cache sur des systèmes basés sur Unix (dans ce cas, Ubuntu 12.0.4)?

Réponses:


12

Les "systèmes basés sur Unix" sont une catégorie beaucoup trop générale pour faire tout type de détermination d'application générale qui s'appliquera à tous les systèmes basés sur Unix. Le problème est que la structure du système de fichiers (et l'endroit "approprié" / "conventionnel" pour mettre les choses) est si incroyablement différente entre les différentes saveurs de "Unix" (si vous pouvez même l'appeler ainsi) que vous devez à peu près le gérer au cas par cas.

Quelques exemples:

  • Sur Ubuntu, les bibliothèques 64 bits vont dans / usr / lib ou / usr / lib / x86_64-linux / et les bibliothèques 32 bits vont dans / usr / lib32
  • Sur Fedora, les bibliothèques 64 bits vont dans / usr / lib64 et les bibliothèques 32 bits vont dans / usr / lib
  • Fedora n'a plus aucune notion de / lib ou / bin (ce ne sont que des liens symboliques vers les répertoires équivalents / usr)
  • La plupart des distributions Linux préfèrent installer les logiciels installés par l'utilisateur (c'est-à-dire les logiciels non fournis par le gestionnaire de paquets) dans / usr / local / (avec lib, bin, etc, var, etc. dans / usr / local /)
  • De nombreuses distributions Linux utilisent / var / cache pour le cache, bien que s'il est "transitoire" (peu importe s'il est perdu), il peut être stocké dans / tmp
  • Certaines applications de type "application dans un dossier" stockent tout dans un sous-répertoire de / opt (en particulier les installateurs clickwrap)
  • Certaines applications s'installent simplement dans un sous-répertoire du répertoire ~ de l'utilisateur (généralement / home / nom d'utilisateur)
  • Sur Solaris, j'ai vu / srv utilisé de manière similaire à / opt, ou parfois / srv est le www-root

La réponse est que la convention canonique, socialement acceptable et bien intégrée pour savoir où stocker quoi que ce soit sur n'importe quel système d'exploitation, que ce soit une distribution de Linux, BSD, Solaris, HP-UX, etc. dépend des circonstances exactes . Plus précisément:

  • Comment le package est-il distribué?
  • L'utilisateur a-t-il besoin d'un accès root pour l'installer?
  • Le package dépend-il ou s'intègre-t-il directement à d'autres packages déjà présents sur le système, par exemple un plugin ou un module complémentaire?
  • Le package va-t-il être intégré dans les référentiels en amont de la distribution, afin que les utilisateurs puissent utiliser une commande comme apt-getou l' yuminstaller directement sans télécharger un programme d'installation sur un site Web?
  • Le logiciel aura-t-il une configuration distincte pour chaque utilisateur différent qui exploite l'ordinateur?
  • Le logiciel aura-t-il des paramètres de configuration globale qui ne devraient être modifiables que par l'administrateur (root)?
  • Le logiciel doit-il s'intégrer au système init (par exemple pour démarrer au démarrage)?

Il n'y a pas de réponse directe à cela sans tenir compte de tous les facteurs. Cependant, pour Ubuntu 12.04 en particulier , si vous créez votre package dans un .debfichier à distribuer dans un PPA ou pour le soumettre aux propres référentiels de packages d'Ubuntu ( mainou universe), je recommanderais que le cache soit stocké dans /var/cache. Mais ce n'est que pour Ubuntu et vous ne devez certainement pas appliquer l'hypothèse que chaque distribution ou système d'exploitation basé sur Unix considérera cela comme acceptable.

De plus, s'il n'y a aucun avantage à sauvegarder les données de cache entre les démarrages du système, je pense que cela pourrait aussi appartenir à / tmp.

Notez que vous allez rencontrer ces problèmes de convention de cheminement pour chaque type de fichier utilisé par votre programme: données partagées, fichiers exécutables, bibliothèques, fichiers d'aide, images, son, pages Web, et ainsi de suite. Je dois donc me demander, si vous posez des questions sur les fichiers cache, comment vous envisagez de gérer les autres types de fichiers. Faites-vous simplement des suppositions naïves et espérez-vous que personne ne soit en désaccord avec vous? Si vous n'avez lu aucune documentation ou norme Ubuntu suggérant où les mettre, c'est une mauvaise idée de supposer simplement une chose ou une autre. Par exemple, toujours coller des bibliothèques dans / usr / lib pourrait être une erreur, car selon la situation, elles peuvent appartenir ailleurs.

De plus, en tant que développeur de logiciels, je pense que la chose la plus responsable à faire est de permettre à l'utilisateur final de décider où placer ses fichiers. Vous pouvez définir des valeurs par défaut, mais les utilisateurs (et les distributeurs) peuvent et vont personnaliser la version pour l'adapter à leur distribution.

La façon la plus simple de le faire est de construire votre programme en utilisant GNU Autoconf . Autoconf est un système de build où l'utilisateur peut passer des arguments de ligne de commande au script de build pour changer les chemins des différents "types de répertoires" loin des valeurs par défaut. Presque chaque distribution a un script de construction pour chaque package Autoconf qui définit les répertoires conventionnels appropriés à la distribution pour chaque type. Ils ont même spécifiquement un type de répertoire pour le cache: sharedstatedir .


Tout d'abord merci beaucoup pour votre réponse, très détaillée en effet. La nature de l'application (ruby) est de mettre en cache les appels d'API qui servent du contenu statique. Ceci est une application ruby, et d'après ce que j'ai lu à votre place de réponse pour mon cache disque, ce serait le /tmpdossier. Les réponses à vos questions seraient (téléchargement, non, non, non, non, non, non). Cela semble probablement normal pour la plupart des gens, /tmpmais je suis nouveau dans les systèmes Unix et les conventions basées sur Ubuntu OS ne me sont pas familières. Cela ouvre une idée intéressante pour gem pour permettre la mise en cache de disque agnostique (agnostique utilisateur). Merci, +1 de ma part.
Dolphin

Notez que le système ruby ​​gem installé sur la plupart des distributions Linux a un répertoire très spécifique où les gemmes sont installées par l' gemoutil. Cependant, il ne serait probablement pas approprié de créer des fichiers lors de l'exécution dans le même répertoire où votre application est téléchargée par la gemme. D'un autre côté, si vous exécutez l'application en tant qu'utilisateur, vous avez besoin d'un répertoire en lecture-écriture pour les utilisateurs , ce qui signifie soit changer les autorisations (ce qui nécessite encore plus de travail d'intégration système au moment de l'installation, comme la création d'un groupe etc), ou en utilisant un répertoire global en lecture-écriture, par exemple / tmp.
allquixotic

Vous ne pouvez pas, et ne doit pas écrire des données /usr, /libou /binde votre application.
ctrl-alt-delor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.