Dans le cadre d’un processus mal écrit ou d’un logrotate erroné, vous pourriez vous retrouver avec des fichiers supprimés mais toujours utilisés par une application. Le problème avec ces fichiers c’est qu’ils prennent de la place physique de manière invisible et vont remplir votre disque.
Si dans le cas courant un simple redémarrage du service permet de fermer le descripteur de fichier (filedescriptor, fd), il peut néanmoins être utile de récupérer les données associées à ce fichier avant de clore le descripteur.
En utilisant l’outils tiers lsof il est possible de lister les descripteurs de fichiers ouverts par un processus, et de retrouver les fichiers supprimés ouverts.
lsof -n | grep deleted
mongod 13916 13959 mongodb 1w REG 202,1 18485978 393297 /var/log/mongodb/mongod.log-20180207 (deleted)
Dans la sortie précédente le processus mongod (PID 13916) lit le fichier /var/log/mongodb/mongod.log-20180207 mais celui-ci est en état supprimé (deleted).
Dans notre cas nous ne pouvons redémarrer le MongoDB, celui-ci est utilisé, et nous avons besoin de récupérer la sortie des logs pour visualiser l’état d’indexation d’une tâche.
La sortie de la commande lsof va s’avérer très utile afin de pouvoir récupérer le contenu du fichier. Le 5ème champ correspond à l’ID du descripteur de fichier pour ce processus et au mode d’ouverture (ici w, donc en écriture).
Maintenant que nous avons ses informations nous pouvons lire le fichier supprimé en utilisant l’interface kernel /proc, le PID du processus et l’ID de son descripteur de fichiers.
tail -f /proc/13916/fd/1
Wed Feb 7 15:45:36.002 [conn31] Background Index Build Progress: 101461000/113980688 89%
Wed Feb 7 15:45:39.006 [conn31] Background Index Build Progress: 101578100/113980688 89%
Wed Feb 7 15:45:42.001 [conn31] Background Index Build Progress: 101713100/113980688 89%
Wed Feb 7 15:45:45.003 [conn31] Background Index Build Progress: 101828500/113980688 89%
Vous savez désormais comment lire le contenu d’un fichier supprimé. A noter qu’on aurait pu sauvegarder cette sortie en lisant l’intégralité du descripteur de fichiers