Où sont tous mes inodes utilisés?
Comment puis-je trouver les répertoires qui sont responsables de mâcher de tous mes inodes?
En fin de compte le répertoire racine sera responsable pour le plus grand nombre d'inodes, donc je ne sais pas exactement quel genre de réponse que je veux..
En gros, je suis à court d'inodes et ont besoin de trouver un inutiles répertoire de la réforme.
Merci, et désolé pour le flou de la question.
- Wow, personnes en cours d'exécution d'i-noeuds? Je n'ai pas vu que depuis les premiers jours de Usenet lorsque vous avez dû vous donner un argument de mkfs pour en faire faire plus d'inodes - parce qu'une news Usenet bobine a eu des tonnes de petits de petits fichiers.
- Ouais, c'est certes un rappel du temps passé.
- Je pense que c'est comme dire, "Wow, vous débordait de la pile, et il y a une grande quantité de mémoire disponible ces jours-ci". Il y a souvent une bonne raison, ce qui se passe (script particulier ou un répertoire) et c'est ce que l'OP est à la recherche pour.
- L'Hébergement Partagé.
Vous devez vous connecter pour publier un commentaire.
Donc, fondamentalement, vous êtes à la recherche pour les répertoires qui ont beaucoup de fichiers? Voici un premier coup de couteau à elle:
où "count_files" est un script shell qui n' (merci Jonathan)
Si vous ne voulez pas faire un nouveau fichier (ou ne pouvez pas parce que vous avez manqué de inodes), vous pouvez exécuter cette requête:
comme initié mentionné dans une autre réponse, à l'aide d'une solution à trouver sera beaucoup plus rapide depuis récursive ls est assez lent, vérifiez ci-dessous pour que une solution! (crédit où le crédit en raison!)
find . -type d | while read i ; do echo `ls -a "$i" | wc -l` "$i" ; done | awk '{ if($1 >= 20) print $0 }' | sort -nr
Méthodes fournies avec récursive ls sont très lents.
Juste pour trouver rapidement le répertoire parent de consommer la plupart des inodes, j'ai utilisé:
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done
je l'ai trouvé encore mieux, car chaque dossier est résultat est sortie dès qu'il est connu, plutôt que d'attendre jusqu'à la fin de trier les résultats. Cela donne une expérience plus interactive et des informations sur l'avancement de la commandefind
dans le cas où elle comporte un espace(s). Le calcul échoue, s'il y a quelques répertoires qui appartiennent à un autre système de fichiers.$i
à gérer le répertoire des noms avec des espaces. par exemple,for i in *; do echo -e "$(find "$i" | wc -l)\t$i"; done | sort -n
J'ai utilisé la suite de travailler (avec un peu d'aide de mon collègue James) que nous avons eu un nombre massif de session PHP les fichiers qui doivent être supprimés sur une machine:
1. Combien d'inodes j'ai obtenu en cours d'utilisation?
2. Où sont tous ces inodes?
C'est beaucoup de PHP les fichiers de session sur la dernière ligne.
3. Comment supprimer tous ces fichiers?
Supprimer tous les fichiers du répertoire qui sont âgés de plus de 1440 minutes (24 heures):
4. Il travaille?
Heureusement, nous avions un sensu alerte en nous envoyant un courriel que notre inodes étaient presque épuisées.
C'est mon prendre sur elle. Il n'est pas si différent des autres, mais le résultat est joli et je pense que ce qui compte le plus valable pour les inodes que d'autres (les répertoires et les liens symboliques). Compte le nombre de fichiers dans chaque sous-répertoire du répertoire de travail; elle trie et les formats de sortie en deux colonnes; et il imprime un grand total (comme des ".", le répertoire de travail). Ce ne sera pas suivre les liens symboliques, mais va compter les fichiers et les répertoires qui commencent par un point. Cela ne compte pas les nœuds de périphérique et les fichiers spéciaux comme des canaux nommés. Il suffit de retirer le "type l-o -type d -o -type f" test si vous voulez compter ceux, trop. Parce que cette commande est divisée en deux trouver les commandes ne peuvent pas correctement la discrimination contre les répertoires montés sur les autres systèmes de fichiers (l'option de montage ne fonctionnera pas). Par exemple, cela devrait vraiment ignorer "/proc" et "/sys" répertoires. Vous pouvez voir que dans le cas de l'exécution de cette commande dans "/" que dont "/proc" et "/sys" grossièrement fausse le grand comptage total.
Exemple:
Voici un simple script Perl qui vais le faire:
Si vous voulez qu'il fonctionne comme
du
(où chaque répertoire de comptage comprend également le récursive compter de la sous-répertoire), puis modifiez la fonction récursivereturn $count
et puis à la récursivité point de dire:Un réellement fonctionnelle one-liner (GNU trouver, pour d'autres types de trouver vous aurez besoin de votre propre équivalent de
-xdev
pour rester sur le même FS.)find /-xdev -type d | while read -r i; do printf "%d %s\n" $(ls -a "$i" | wc -l) "$i"; done | sort -nr | head -10
La queue est, de toute évidence, personnalisable.
Comme beaucoup d'autres suggestions ici, cela va vous montrer la quantité d'entrées dans chaque répertoire, de manière non-récursive.
P. S.
Rapide, mais imprécis one-liner (détection par nœud du répertoire de la taille):
find /-xdev -type d -size +100k
dir.0 -- 27913
dir.1 -- 27913
utilisation
puis appuyez sur Shitf+c pour trier les éléments de comptage où l'élément est un fichier
Le script perl est bon, mais méfiez-vous des liens symboliques - recurse uniquement lorsque -l filetest retourne false ou vous allez, au mieux, plus de temps, au pire une boucle infinie (ce qui pourrait - préoccupation mineure - invoquer Satan règne de 1000 ans).
L'idée de compter les inodes dans un fichier de l'arborescence du système tombe à l'eau lorsqu'il y a plusieurs liens de plus qu'un petit pourcentage des fichiers.
Voulais juste mentionner que vous pouvez aussi chercher indirectement à l'aide de la taille de répertoire, par exemple:
Où 500k pourrait être augmenté si vous avez beaucoup de gros répertoires.
Notez que cette méthode est pas récursive. Cela va seulement vous aider si vous avez beaucoup de fichiers dans un répertoire unique, mais pas si les fichiers sont uniformément distribués dans l'ensemble de ses descendants.
Juste une remarque, lorsque vous avez enfin trouver quelques-mail répertoire de spool, et que vous voulez supprimer toutes les cochonneries qu'il y a dedans, rm * ne fonctionnera pas si il y a trop de fichiers, vous pouvez exécuter la commande suivante pour supprimer rapidement tout dans ce répertoire:
* AVERTISSEMENT * CELA VA SUPPRIMER TOUS les FICHIERS RAPIDEMENT POUR les CAS de rm NE fonctionne PAS
for
est assez agile, mais peut être plus compliqué à écrire.Ce compte les fichiers sous le répertoire courant. Cela est censé fonctionner, même si les noms de fichiers contiennent des retours à la ligne. Il utilise GNU Awk. Changer la valeur de d pour obtenir voulais maximum chemin séparé par des profondeurs. 0 signifie pas de limite en profondeur.
Même par Bash 4; c'est beaucoup plus lentement dans mon expérience:
Cette commande fonctionne dans de très rare cas où votre structure de répertoire est identique à la mienne:
find /-type f | grep -oP '^/([^/]+/){3}' | sort | uniq -c | sort -n