Dans quel dossier dois-je écrire pour mes fichiers intermédiaires, en tant que développeur?

17

Je commence à écrire quelques scripts bash pour mon projet et ils ont besoin d'écrire des fichiers ou des variables intermédiaires.

Je veux savoir à quels dossiers puis-je être sûr d'avoir accès lorsque quelqu'un exécute mon script? Est-ce une pratique courante à utiliser /tmp/? Ou devrais-je utiliser autre chose?

Programmation Noob
la source

Réponses:

21

Je trouve le document Filesystem Hierarchy Standard inestimable lorsque je recherche ce genre de choses.

Il y a quelques options,

  • / tmp - fichiers temporaires «non permanents»
  • / var / tmp - fichiers temporaires "permanents"
  • / var / cache - fichiers de données transitoires «application»

Cela dépend vraiment du type de données que vous stockez.

EightBitTony
la source
mieux utiliser ce que l'utilisateur / l'environnement vous donne et n'utiliser que / tmp etc. comme solution de rechange. (ce qu'a dit unix.stackexchange.com/a/79776/7784 )
Oluf Lorenzen
15

Si vous avez besoin d'écrire des fichiers temporaires qui ne durent aussi longtemps que votre script ou une application en cours d' exécution est, utilisez le répertoire indiqué par la TMPDIRvariable d'environnement, ou si cette variable est pas définie, /tmp.

/tmpest effacé au démarrage sur certains systèmes (parfois même en RAM, par exemple sur Solaris par défaut et sur certaines installations Linux), il ne peut donc pas être utilisé pour des fichiers qui doivent survivre à une panne de courant ou à un redémarrage. /var/tmppeut être utilisé pour les fichiers qui doivent survivre à un redémarrage, mais qui peuvent être nettoyés par l'administrateur système de temps en temps. Si votre application doit enregistrer des fichiers de façon permanente, écrivez-les quelque part dans le répertoire personnel de l'utilisateur (dans ~/.programmingnoobsappou ~/.cache/programmingnoobsapp) ou sous /var/lib/programmingnoobsappou /var/cache/programmingnoobsapp.

Notez qu'il /tmpest partagé entre tous les utilisateurs, vous devez donc prendre des précautions lors de la création d'un fichier là-bas. Vous devez choisir un nom de fichier qui n'existe pas encore, et vous devez faire attention à ne pas autoriser une condition de concurrence critique où un autre processus crée le fichier devant vous avec des autorisations différentes, ce qui pourrait être une faille de sécurité (si l'autre processus fonctionne en tant qu'utilisateur différent, il pourrait alors accéder et modifier les données de votre processus). Utilisez la mktempcommande pour créer un fichier dans /tmpou /var/tmp. Par défaut, mktempcrée un fichier dans $TMPDIR, ou /tmps'il TMPDIRn'est pas défini, qui est généralement au bon endroit. Si vous devez utiliser plusieurs fichiers temporaires, ou même si vous en avez besoin d'un seul, je vous recommande de créer un répertoire pour tous vos fichiers temporaires avecmktemp -d et le supprimer à la fin de votre script.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…
Gilles 'SO- arrête d'être méchant'
la source
par rapport à mktemp, je ne supprime pas les fichiers temporaires à la fin de mon script. J'ai un travail cron tmpwatch qui supprime automatiquement les anciens fichiers. Dans la grande majorité des cas, je ne lis pas le fichier intermédiaire et le système supprimera les fichiers par lui-même. Cependant, si quelque chose ne va pas avec le script, j'ai tous mes fichiers intermédiaires pour un débogage facile.
emory
1
+1 pour mktemp. Pour moi, c'est la bonne réponse: déléguer la tâche de créer en toute sécurité un fichier temporaire à mktemp(voir cet article ). Bien que la seule réponse citant le FHSait également une grande valeur.
Carlos Campderrós
Pourquoi initialisez-vous tmp_rootavant de l'attribuer? Cela ne lui serait-il pas plus naturel unset?
l0b0
@ l0b0 L'un ou l'autre fonctionnera (sauf sous set -u, mais c'est rare). Il doit être (dé) défini sur une valeur sûre avant de définir l'interruption, au cas où le script serait tué juste après avoir défini l'interruption.
Gilles 'SO- arrête d'être méchant'
J'ajouterais set -o errexitque si tmp_rootest déjà défini en lecture seule dans l'environnement, il ne détruira pas le mauvais répertoire ...
l0b0
2

Juste pour compléter les réponses qui ont déjà été publiées jusqu'à présent.

Il existe également /dev/shmsur certaines distributions Linux qui peuvent être utilisées pour le stockage temporaire. Ce stockage ne doit être utilisé que lorsque les performances des E / S de fichiers sont un facteur critique étant donné qu'il /dev/shmutilise le tmpfssystème de fichiers. Il doit également être utilisé pour des fichiers et des données de taille raisonnable. Le tmpfssystème de fichiers utilise une RAM système comme stockage, il n'est donc pas persistant de démarrage en démarrage.

Il y a aussi un bon aperçu de tous les choix mentionnés ici sur StackOverflow dans cette Q&R intitulée: / tmp vs / dev / shm pour le stockage de fichiers temporaires sous Linux? . Il est bien couvert dans ce Q&R SuperUser intitulé: Quand devrais-je utiliser / dev / shm / et quand devrais-je utiliser / tmp? .

Les références

slm
la source
0

Oui, /tmpc'est surtout pour les fichiers qui sont requis temporairement. Le / tmp a un bit collant sur ce qui signifie que seul le propriétaire de l'élément, le propriétaire du répertoire ou le superutilisateur peut renommer ou supprimer des fichiers. de nombreux programmes l'utilisent pour créer des fichiers de verrouillage et pour le stockage temporaire des données. Sur certaines distributions, ce répertoire est effacé au démarrage ou à l'arrêt.

Raza
la source
1
Tous les répertoires / tmp ne sont pas effacés au démarrage. Par exemple, les installations AIX par défaut ne le font pas (et c'est UNIX et Linux, pas seulement Linux).
EightBitTony
Cependant, s'il est résident "mémoire", ce qui semble être la valeur par défaut dans de nombreux cas, il disparaît lorsque le système s'arrête pour une raison quelconque.
mdpc