Salut J'ai de nombreux fichiers qui ont été supprimés mais pour une raison quelconque, l'espace disque associé aux fichiers supprimés ne peut pas être utilisé jusqu'à ce que je tue explicitement le processus pour le fichier prenant l'espace disque
$ lsof /tmp/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cron 1623 root 5u REG 0,21 0 395919638 /tmp/tmpfPagTZ4 (deleted)
L'espace disque occupé par le fichier supprimé ci-dessus provoque des problèmes tels que lorsque j'essaie d'utiliser la touche de tabulation pour compléter automatiquement un chemin de fichier, j'obtiens l'erreur bash: cannot create temp file for here-document: No space left on device
Mais après avoir exécuté kill -9 1623
l'espace pour ce PID est libéré et je ne reçois plus l'erreur.
Mes questions sont:
et veuillez me faire savoir toute terminologie incorrecte que j'ai utilisée ou toute autre information pertinente et pertinente concernant cette situation.
Sur les unités, les noms de fichiers ne sont que des pointeurs (inodes) qui pointent vers la mémoire où réside le fichier (qui peut être un disque dur ou même un système de fichiers sauvegardé en RAM). Chaque fichier enregistre le nombre de liens vers celui-ci: les liens peuvent être soit le nom du fichier (pluriel, s'il existe plusieurs liens durs vers le même fichier), et également chaque fois qu'un fichier est ouvert, le processus contient en fait le "lien" vers le même espace.
L'espace n'est physiquement libéré que s'il n'y a plus de liens (il est donc impossible d'y accéder). C'est le seul choix judicieux: pendant que le fichier est utilisé, ce n'est pas important si quelqu'un d'autre ne peut plus y accéder: vous l'utilisez et jusqu'à ce que vous le fermiez, vous avez toujours le contrôle - vous ne remarquerez même pas le nom du fichier est parti ou déplacé ou autre chose. C'est même utilisé pour les fichiers temporaires: certaines implémentations créent un fichier et le dissocient immédiatement, il n'est donc pas visible dans le système de fichiers, mais le processus qui l'a créé l'utilise normalement. Le plugin Flash aime particulièrement cette méthode: tous les fichiers vidéo téléchargés sont maintenus ouverts, mais le système de fichiers ne les affiche pas.
Donc, la réponse est, alors que les processus ont encore les fichiers ouverts, vous ne devriez pas vous attendre à récupérer l'espace. Il n'est pas libéré, il est activement utilisé. C'est également l'une des raisons pour lesquelles les applications doivent vraiment fermer les fichiers lorsqu'elles ont fini de les utiliser. En utilisation normale, vous ne devriez pas penser à cet espace comme étant gratuit, et cela ne devrait pas non plus être très courant - à l'exception des fichiers temporaires qui sont dissociés exprès, il ne devrait pas y avoir vraiment de fichiers que vous voudriez envisager d'être inutilisé, mais toujours ouvert. Essayez de vérifier s'il existe un processus qui le fait beaucoup et examinez comment vous l'utilisez, ou tout simplement trouver plus d'espace.
Les fichiers sont supprimés du système de fichiers où est supprimée toute référence à cet inode. La référence peut être sur disque (lien dans n'importe quel répertoire), et .. à partir d'applications ouvertes. Si vous supprimez le fichier - vous supprimez uniquement la référence du disque, mais - il y a toujours une référence de l'application.
Vous pouvez "libérer" de l'espace de deux manières:
Si vous connaissez pid - regardez quels fichiers sont ouverts par ce pid: ls -l/proc/PID/fd vous voyez ici des liens comme:
undefine @ uml: ~ $ ls -l /proc/18596/fd[.____.[razem 0 lrwx ------ 1 undefine undefine 64 lut 1 00:06 0 - > /dev/pts/30[.____. dipllrwx------ 1 indéfinir indéfinir 64 lut 1 00:06 1 -> /dev/pts/30 indéfinir indéfinir 64 lut 1 00:05 2 -> /dev/pts/30[.____. dipllr-x------ 1 indéfinir indéfinir 64 lut 1 00:06 3 ->/home/indéfinir/x ( supprimé) lr-x ------ 1 indéfinir indéfinir 64 lut 1 00:06 4 -> anon_inode: inotify
Comme vous le voyez, 3 fd est supprimé. vous pouvez le tronquer par commande (par exemple):
indéfinir @ uml: ~ $:>/proc/18596/fd/3 indéfinir @ uml: ~ $
N'oubliez pas que si l'application lit ce fichier, cela peut être dangereux pour eux. Mais - s'il ne s'agit que d'un fichier journal - vous pouvez le tronquer en toute sécurité.
Comme d'autres l'ont dit, lsof
peut être utilisé pour répertorier tous les fichiers supprimés qui sont toujours sur le disque en raison de l'ouverture des descripteurs de fichiers. Cependant, cela peut être une très longue liste. Voici une commande qui répertorie ces fichiers triés par taille croissante en octets:
Sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n
Il peut y avoir une façon plus succincte de le faire, mais la commande ci-dessus a fonctionné pour moi.
L'espace n'est pas immédiatement libéré car le processus en cours d'exécution a toujours un descripteur de fichier ouvert sur le fichier qui vient d'être supprimé. Après tout, si un processus essaie toujours d'utiliser un fichier, vous ne voulez probablement pas vraiment que le noyau s'en débarrasse (le fichier). Cela pourrait rendre le processus un peu bouleversé. La meilleure façon (et pour autant que je sache) de libérer de l'espace est de faire exactement ce que vous avez fait - tuer le processus.
Essayez d'utiliser la commande ci-dessous
lsof | grep deleted
puis tuez le pid du fichier supprimé.