Très souvent, nous exécutons un exécutable qui doit écrire / lire certains fichiers temporaires. Nous créons généralement un répertoire temporaire, y exécutons l'exécutable et supprimons le répertoire lorsque le script est terminé.
Je veux supprimer le répertoire même si l'exécutable est tué. J'ai essayé de l'envelopper:
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
/usr/local/bin/my_binary
Quand il my_binary
meurt, le dernier processus du noyau supprimera le répertoire, car le script est le dernier processus qui contient cela inode
; mais je ne peux pas créer de fichier dans le répertoire supprimé.
#!/bin/bash
dir=$(mktemp -d /tmp/foo.XXXXXXX) && cd $dir && rm -rf $dir
touch file.txt
les sorties touch: file.txt: No such file or directory
Le mieux que j'ai pu trouver est de supprimer le répertoire temporaire à la fin du processus, d'attraper les signaux les plus courants et d'exécuter un processus de nettoyage avec cron:
#!/bin/bash
dir=$(mktemp -d /tmp/d.XXXXXX) && cd "$dir" || exit 99
trap 'rm -rf "$dir"' EXIT
/usr/local/bin/my_binary
Existe-t-il un moyen simple de créer un répertoire vraiment temporaire qui est supprimé automatiquement lorsque le binaire actuel meurt, quoi qu'il arrive?
cleanup
peut être exécutée avant la fin de mktemp. Vous voudrez peut-êtreunset dir
avant de régler le piège.Réponses:
Votre dernier exemple est le plus sûr.
Cela s'exécutera tant que le shell lui-même sera toujours fonctionnel. Fondamentalement, SIGKILL est la seule chose qu'il ne gérera pas car le shell est terminé de force.
(peut-être que SIGSEGV aussi, n'a pas essayé, mais il peut être attrapé)
Si vous ne laissez pas au shell le soin de nettoyer après lui-même, la seule autre alternative possible est de demander au noyau de le faire. Ce n'est normalement pas une fonctionnalité du noyau, mais il y a une astuce que vous pouvez faire, mais elle a ses propres problèmes:
Fondamentalement, vous créez un montage tmpfs, puis vous le démontez paresseusement. Une fois le script terminé, il sera supprimé.
L'inconvénient autre que d'être trop complexe, c'est que si le script meurt pour une raison quelconque avant le démontage, vous n'avez pas de monture qui traîne.
Cela utilise également tmpfs, qui consommera de la mémoire. Mais vous pourriez rendre le processus plus complexe et utiliser un système de fichiers en boucle, et supprimer le fichier le sauvegardant après son montage.
En fin de compte, le
trap
meilleur en termes de simplicité et de sécurité, et à moins que votre script ne soit régulièrement SIGKILL, je m'en tiendrai à cela.la source
mktemp
ou après? Je pense que si le piège est placé juste avant lemktemp
, alors même si le signal de sortie était reçu après le piège et avant lemktemp
, tout ce qui se passerait serait qu'unerm -rf
commande serait exécutée avec un argument vide, sans rien faire. Mais si le piège était après lemktemp
, il pourrait y avoir une minuscule fenêtre de chance que le répertoire temporaire soit laissé. Ou suis-je complètement hors de la base?Vous pouvez utiliser la fonction d' attente intégrée pour attendre la fin d'un travail d'arrière-plan:
la source
blah; rm -rf $DIR
, non? Il a le problème de fuir $ DIR si le script est tué.