Comment trouver des fichiers volumineux qui ont été supprimés mais qui sont encore ouverts dans une application? Comment peut-on supprimer un tel fichier, même si un processus l'a ouvert?
La situation est que nous exécutons un processus qui remplit un fichier journal à un rythme effarant. Je connais la raison et je peux y remédier. Jusque-là, j'aimerais supprimer ou vider le fichier journal sans arrêter le processus.
Cela ne rm output.log
supprime que les références au fichier, mais celui-ci continue à occuper de l'espace sur le disque jusqu'à la fin du processus. Pire: rm
je n'ai plus aucun moyen de trouver où se trouve le fichier ni quelle est sa taille! Est-il possible de trouver le fichier et éventuellement de le vider, même s'il est toujours ouvert dans un autre processus?
Je fais spécifiquement référence aux systèmes d'exploitation basés sur Linux tels que Debian ou RHEL.
rm
fichiers ed qui sont encore ouverts?
lsof | grep "(deleted)"
. Lorsqu'il n'y a plus de processus contenant un fichier supprimé ouvert, le noyau libère les blocs inode et disque. Les processus ne disposent pas de "gestionnaires" grâce auxquels ils peuvent être informés qu'un fichier ouvert, essentiellement verrouillé, a été supprimé du disque.
lsof | grep '(deleted)'
fonctionne aussi sous Linux. Sous Linux, vous pouvez être averti de la suppression de fichier (même les fichiers qui ne possèdent déjà aucune entrée dans un répertoire autre que / proc / some-pid / fd) avec le mécanisme inotify (événement IN_DELETE_SELF)
somefile
et ouvert dans VIM, puis rm
édité dans un autre processus bash. Je lance alors lsof | grep somefile
et il n'est pas là, même si le fichier est ouvert dans VIM.
lsof -p <pid>
pour répertorier ses fichiers ouverts et leurs tailles. Le fichier supprimé aura un à(deleted)
côté de lui. Le fichier supprimé sera lié à/proc/<pid>/fd/1
probablement. Je ne sais pas comment faire en sorte qu'un processus arrête d'écrire dans son descripteur de fichier sans le terminer. Je pense que cela dépend du processus.