Comment empêcher le nettoyage d'un dossier à l'intérieur de / tmp?

12

Cette question concerne Ubuntu 14.10 sur mon ordinateur portable de développeur.

J'ai un dossier /tmpqui est utilisé par une application pour y mettre des éléments temporaires. Cette application crée généralement un dossier temporaire dans mon homedir et le supprime ensuite. Pour une raison quelconque, cela ne fonctionne pas lorsque le homedir est crypté. Au lieu de cela, j'ai créé un lien symbolique vers l' /tmp/foointérieur de mon homedir. Mon application peut y écrire et en faire un sous-dossier temporaire.

Est maintenant /tmp/foosupprimé à chaque redémarrage de ma machine. Jusqu'à présent, je viens de recréer le dossier manuellement après le redémarrage. Maintenant, j'ai appris dans Comment le répertoire / tmp est-il nettoyé? qu'il y a un travail à faire.

J'ai regardé /etc/init/mounted-tmp.confmais mon bashfu et surtout mon findfu ne suffisent pas à faire ce que je veux. Voici un extrait de ce fichier:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

Ce que je veux faire, c'est ajouter une condition qui fait qu'il supprime tout à l'intérieur /tmp/foo, mais pas /tmp/foolui-même. Comment je fais ça?

simbabque
la source
Est-ce /tmp/fooun répertoire ou un fichier?
terdon
Un répertoire. Il y a des fichiers à l'intérieur.
simbabque
Pourquoi ne pas ajouter mkdir /tmp/foojuste avant end script?
Hagen von Eitzen
Juste pour info (vous le savez peut-être déjà): 14.10 atteint EOL en juillet 2015, vous devriez donc vraiment passer à Vivid dès que possible.
Léo Lam

Réponses:

20

/etc/init/mounted-tmp.conffait partie du mountallpackage, donc toutes les mises à jour sur ce package et les modifications suggérées seront annulées.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Au lieu de cela, selon la norme Filesystem Hierachy (FHS) ;

Concernant / tmp :

Les programmes ne doivent pas supposer que tous les fichiers ou répertoires dans / tmp sont conservés entre les invocations du programme.

Concernant / var / tmp :

Le répertoire / var / tmp est disponible pour les programmes qui nécessitent des fichiers temporaires ou des répertoires qui sont conservés entre les redémarrages du système. Par conséquent, les données stockées dans / var / tmp sont plus persistantes que les données dans / tmp.

Vous devez donc modifier votre lien symbolique pour utiliser à la /var/tmpplace de /tmp.

mgor
la source
3
Exemple classique lorsque vous avez un marteau, tout ressemble à un clou.
WernerCD
@WernerCD pourriez-vous expliquer ce que vous entendez par là? Êtes-vous en train de dire que ce /var/tmpn'est pas une bonne idée?
simbabque
6
Quand tout ce que vous avez est un marteau ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Je dis que l'OP utilise / tmp pour quelque chose pour lequel il n'est pas destiné - Utiliser / tmp comme marteau pour son problème de garder tmp-mais-pas-tout-à-fait -tmp truc. / var / tmp est censé être conservé entre les redémarrages, c'est donc la bonne réponse.
WernerCD
8

Pas strictement une réponse à votre question, mais vous pourriez trouver /var/tmpun emplacement plus approprié, car il ne sera pas nettoyé lors d'un redémarrage. Il est conçu pour les fichiers temporaires qui ne doivent pas être supprimés automatiquement après un court instant.

Ce que je fais souvent, cependant, c'est de créer moi-même un dossier sous / opt pour stocker des choses aléatoires que je ne veux pas à la maison. C'est un endroit approprié pour mettre des choses hors du contrôle du système d'exploitation principal.

Andrew Aylett
la source
C'est la bonne idée. Si / tmp ne fait pas ce que vous voulez, stockez vos informations ailleurs - même sur un autre lecteur s'il y a de l'espace disponible. Ne jouez pas avec des choses que Linux (et d'autres programmeurs) s'attendent à avoir d'une certaine manière, à moins que ce soit le seul moyen d'obtenir le résultat dont vous avez besoin.
Joe
6

Ainsi:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Exemple:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Je suis d'accord avec l'utilisateur aap: vous devez soit vous en occuper dans le logiciel utilisé en recréant le répertoire s'il s'agit de fichiers tmp, soit utiliser un autre répertoire s'il ne s'agit pas de fichiers tmp qui ne sont pas purgés.

Rinzwind
la source
Cela ne fonctionne pas vraiment. Bien que la findcommande fonctionne comme prévu lorsqu'elle est exécutée manuellement, le répertoire est toujours supprimé après la modification /etc/init/mounted-tmp.conf. Il semble qu'il se passe autre chose ici.
terdon
wth. ehm. cela devrait signifier que la 1ère ligne est défectueuse. peut-être que cela doit être relatif (?)
Rinzwind
@terdon yes semble devoir être relatif à / tmp /
Rinzwind
Je ne pense pas, j'ai essayé différentes permutations, y compris -path ./fooet même -name '*foo*'et aucune d'entre elles n'a fonctionné (sur Ubuntu Server 14.04). Je pense que ce n'est tout simplement pas le bon dossier et nous cherchons au mauvais endroit. Ce que vous proposez devrait fonctionner, cela ne semble tout simplement pas.
terdon
0

C'est une mauvaise idée d'avoir des fichiers avec une valeur future, d'écrire dans le répertoire / tmp (/ var / tmp, comme suggéré par d'autres, est un meilleur endroit). Cela dit, vous voudrez peut-être donner une chance à chattr. Cela doit être exécuté après la fermeture de l'application, mais avant un arrêt. N'oubliez pas que cette opération ne permet plus rien d' écrire dans ce répertoire.

toucher /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Hopping Bunny
la source
En quoi cela serait-il utile si je souhaite avoir un répertoire temporaire?
simbabque
-1

Lance ça:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

puis ajoutez ceci à / etc / inittab voir ici: où est le fichier inittab? :

foo:2345:boot:/bin/foodel

Cela créera / etc / foo au démarrage s'il n'existe pas, puis le videra.

Cela fera de même lors de la connexion bash:

echo "/bin/foodel" >> ~/.bashrc
Daniel
la source
Ubuntu version 14 n'utilise pas /etc/inittab. Ceci est clairement et sans équivoque indiqué sur sa page de manuel.
JdeBP
* facepalm * Désolé @JdeBP, c'est ce qui m'arrive après avoir jonglé avec 4 versions différentes de linux. Il peut mettre le code quelque part indiqué askubuntu.com/questions/34308/where-is-inittab-file
Daniel