Est-ce que / tmp est garanti?

42

Dois-je vérifier et créer /tmpavant d'écrire dans un fichier à l'intérieur de celui-ci? Supposer que personne n'a couru sudo rm -rf /tmpparce que c'est un cas très rare

Ayush
la source
16
Qu'entendez-vous par "garanti"? La FHS l'exige, donc toute distribution conforme à la FHS l'aurait. Cependant, de nombreuses distributions spéciales ne sont pas conformes à la norme FHS. Il est certainement possible de créer une distribution Unix / Linux sans / tmp, mais si vous devez vous soucier de cela, cela dépend entièrement de la prise en charge de ces systèmes.
Lie Ryan
1
Pourquoi ne pas créer votre propre répertoire temporaire et le supprimer lorsque vous avez terminé, au lieu de vous fier au prochain redémarrage pour le nettoyer?
WGroleau
4
@WGroleau Je ne sais pas à propos de OP, mais dans les scripts que j'écris pour mon propre système, je mets généralement les fichiers temporaires dans un sous-répertoire de /tmp(créé avec mktemp), puis supprime ce sous-répertoire à la sortie. La plupart de mon système est monté en lecture seule, ce qui évite d'avoir à mémoriser cdun répertoire accessible en écriture
Fox
1
@WGroleau Je ne compte pas sur les redémarrages pour le nettoyer. les mktemplooks vraiment super, je finis probablement par utiliser ça.
Ayush le
7
@ jamesqf Ouais, le redémarrage n'est pas nécessaire pour effacer /tmp. Cependant, à l'inverse, il est autorisé à le faire et WGroleau a probablement trop extrapolé. Mon /tmpest tmpfsen attente dans la RAM, il est donc effacé à l’arrêt. Pourtant, ce n'est qu'un détail du système, qui n'est pas garanti par la FHS. Donc, au commentaire original, il est insensé de compter sur la présence ou l’ absence de quoi que ce soit /tmpentre les bottes.
underscore_d

Réponses:

60

Les FHS mandats qui /tmpexistent, tout comme POSIX de sorte que vous pouvez compter sur son être là (au moins sur les systèmes conformes, mais vraiment il est à peu près assuré d'être présent sur Unix systèmes). Mais vous ne devriez pas: l'administrateur système ou l'utilisateur peut préférer d'autres emplacements pour les fichiers temporaires. Voir Trouver le bon répertoire tmp sur plusieurs plates-formes pour plus de détails.

Stephen Kitt
la source
Ceci est bien sûr un échec de la conception. /tmpest un nom. $TMPDIRest un autre nom. Si vous ne pouvez pas compter sur /tmple nom correct du répertoire temporaire, pourquoi pouvez-vous compter sur $TMPDIRle nom de la bonne variable d'environnement? Pourquoi ne devrais-je pas vérifier $TMPDIRVARpour obtenir le nom de cette variable? Un seul niveau d'indirection suffit, et /tmpc'est exactement cela. Il ne dit rien sur le stockage réel, c'est juste un nom.
MSalters
@MSalters, il y a un peu plus que ça. Avant les espaces de noms, $TMPDIRautorisez chaque utilisateur à disposer d’un répertoire temporaire distinct, voire à utiliser différents répertoires temporaires pour différents programmes; un seul /tmpne fournit pas cela (encore une fois, sans espaces de noms ou quelque chose de similaire). Il y a aussi beaucoup d'histoire (ou d'héritage) à prendre en compte.
Stephen Kitt
Par utilisateur est un argument valable, mais c’est la raison pour laquelle une bonne conception utiliserait ~/tmpcela. Ce qui peut toujours être le même emplacement physique que /tmp, bien sûr.
MSalters
44

En pratique, il /tmpest quasiment garanti d'exister. Cependant, même s'il existe, cela ne signifie pas que vous devriez y placer des fichiers temporaires.

La convention standard consiste à utiliser la TMPDIRvariable d'environnement. S'il existe, il pointe vers un répertoire pour les fichiers temporaires. S'il n'existe pas, mettez des fichiers temporaires dans /tmp.

Dans un script shell, vous pouvez utiliser "${TMPDIR:-/tmp}"comme emplacement de fichier temporaire: cela étend la valeur à TMPDIRsi elle est définie¹, et /tmpsinon. Ou vous pouvez définir TMPDIRconditionnellement au cas où il ne serait pas défini , avec la commande

: "${TMPDIR:=/tmp}"

puis créez des fichiers temporaires à l'intérieur "$TMPDIR".

Notez que toute application peut créer des fichiers sous /tmpou $TMPDIR. De plus, ce répertoire peut être partagé entre des utilisateurs. Vous devez donc vous préoccuper des autorisations lorsque vous créez un fichier. De nombreux systèmes (Linux, * BSD) ont une commande mktempqui crée des fichiers en toute sécurité dans le bon répertoire. C'est généralement une bonne idée de mktempcréer des fichiers temporaires et un répertoire, en particulier à partir d'un script shell, où il est impossible de créer un fichier en toute sécurité dans un répertoire partagé en raison de la possibilité d'attaques par des liens symboliques ( mkdirc'est bien si vous gérez les erreurs correctement).

¹ et non vide - si la variable est vide, elle n'est pas utilisable telle quelle, et il est généralement préférable de traiter les variables vides ou non définies de la même manière si elles sont supposées contenir un nom de fichier.

Gilles, arrête de faire le mal
la source
11
Vous pourriez peut-être mentionner que les utilisateurs doivent s'attendre à des collisions de noms de fichiers. Donc, IMO, le seul moyen recommandé de créer des fichiers dans / tmp est la commande mktemp, qui devrait également gérer automatiquement $ TMPDIR.
rudimeier
C'est la réponse que vous voulez. J'ai vu des systèmes sans / bin et encore moins / tmp.
Josué
1
État A.10 de la structure et des unités de l' annuaire : ... L' /tmpannuaire est conservé dans POSIX.1-2008 afin de prendre en charge les applications historiques qui assument sa disponibilité. Les implémentations sont encouragées à fournir des noms de répertoire appropriés dans la variable d'environnement TMPDIRet les applications sont encouragées à utiliser le contenu de TMPDIRpour créer des fichiers temporaires. ...
Andrew Henle
3
Triste de constater que ce mktempn’est pas dans POSIX, bien que ce soit déjà dans la plupart des systèmes d’exploitation populaires tels que GNU (Linux) , OpenBSD , FreeBSD et macOS .
Franklin Yu
1
Cela vaut peut-être la peine d’ajouter que des mktempfonctions similaires sont disponibles dans de nombreux langages de script et de programmation, tels que libc , Perl et Python .
Gaurav
6

Bien que cela existe très probablement, vous devriez vérifier pour une autre raison: ce n'est pas garanti d'être gros . Sur de nombreux systèmes, la /tmpsauvegarde est assurée par la RAM plutôt que par le disque, et est susceptible d’être limitée à quelques Go. (Sur les systèmes Fedora, la moitié de la RAM est utilisée par défaut.) Donc, vous devriez vérifier non seulement l'existence, mais également la possibilité de placer tout ce que vous souhaitez y placer.

Si vous avez quelque chose de gros, utilisez /var/tmp/.

mattdm
la source
2
Je ne suis pas sûr que ce soit "à la manière d'Unix" de vérifier l'espace disponible avant de continuer, d'autant plus qu'on ne sait pas toujours exactement combien d'espace vous aurez besoin. Dans tous les cas, vous devez être prêt à gérer correctement une erreur d'écriture au cas où le système de fichiers deviendrait saturé. et si vous voulez faire cela, que gagne-t-on en faisant un contrôle préalable qui sera sujet aux faux négatifs et aux positifs?
Nate Eldredge
2
Cela dépend de votre capacité à gérer le cas d'échec, je suppose. Le point principal est de ne pas supposer que /tmppeut gérer des fichiers volumineux. Supposons qu'il s'agisse d'un téléchargement de 10 Go sur une liaison à vitesse modérée. "À la manière d'Unix" ou pas, c'est assez misérable de découvrir plusieurs heures que ça ne marchera pas.
mattdm
1
@mattdm Vérifier tôt, c'est bien, mais les échecs doivent être gérés. Peut-être que / tmp a 10 Go disponibles au début du téléchargement, mais qu’un autre utilisateur y copie 5 Go pendant le téléchargement. Maintenant quoi? Il h.
Zan Lynx
Absolument! Je ne veux pas dire cela comme une excuse pour ne pas gérer les échecs.
mattdm
"Si vous avez quelque chose d'important" - utilisez / tmp et laissez le système d'exploitation changer s'il le souhaite.
UKMonkey