Lorsque de gros fichiers sont supprimés sur un serveur, les fichiers peuvent toujours être référencés par des processus, de sorte que le système de fichiers ne dispose pas de plus d'espace libre.
J'ai essayé d'utiliser lsof , mais il semble qu'il n'ait pas répertorié les fichiers supprimés. fuser -c
a mieux fonctionné, mais la liste des processus est tout simplement trop longue pour être vérifiée pour chaque processus, d'autant plus que chaque processus est un processus Oracle.
bash-3.2# fuser -c /var
/var: 105o 29999o 20444c 3528c 27258o 7715o 3864o 3862o 2494o 18205o 17450co 17445co 14912co 14824co 14818co 14816o 14814o 8532c 8530c 7633com 7118o 6958o 6790c 6784co 6734o 6693o 6689o 6684o 6675o 6635o 6594c 6548o 6547o 6546o 6545o 6544o 6543o 6542o 6541o 6540o 6537o 6535o 6456o 6128co 6113o 335o 245co 229o 161o 8o
bash-3.2# du -hs /proc
139T /proc
Il arrive parfois qu'un fichier soit supprimé par une application ou un utilisateur, par ex. un fichier journal et que ce fichier est toujours référencé par un processus qui ne peut pas être redémarré.
Existe-t-il des méthodes propres à récupérer de l'espace disque sur les fichiers supprimés sans redémarrer le processus qui fait référence à ce fichier supprimé?
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'
Trouvez tous les descripteurs de fichiers ouverts.
Grep supprimé.
StdError à/dev/null
Sortie:
160448715 0 lrwx------ 1 user user 64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)
Ou vous pouvez utiliser awk
trouver/proc/*/fd -ls 2>/dev/null | awk '/ supprimé/{print $ 11}';
sortie awk (testée dans bash Ubuntu 12.04):
/proc/28680/fd/113
Trouver et tronquer tous les fichiers supprimés (testé dans bash Ubuntu 12.04):
(NE FAITES PAS CELA SI VOUS NE SAVEZ PAS CE QUE VOUS FAITES)
find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0
- p Demander avant d'exécuter tronquer
La meilleure façon est de tronquer manuellement
Tronçon manuel:
: > /proc/28680/fd/113
ou:
> /proc/28680/fd/113
ou:
truncate -s 0 /proc/28680/fd/113
Prendre plaisir ;)
Voici un exemple simple avec less
:
Supposons que nous ayons un fichier, my10MBfile
:
$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s
$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9225 4662 67% /
Maintenant j'ouvre ce fichier avec less
(oui, c'est un fichier binaire ... tant pis)
$ less /tmp/my10MBfile &
$ lsof -p $(pidof less) | grep 10MBfile
less 29351 max 4r REG 8,3 10485760 521464 /tmp/my10MBfile
Ensuite, je supprime ce fichier
$ rm /tmp/my10MBfile
$ lsof -p $(pidof less) | grep 10MBfile
less 29351 max 4r REG 8,3 10485760 521464 /tmp/my10MBfile (deleted)
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9225 4662 67% /
Il est toujours là, mais supprimé. Regardez la 4e colonne de la sortie lsof: File Descriptor number 4 ouvert pour Reading (4r)
Lançons GDB!
$ gdb -p $(pidof less)
GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....
(gdb) p close(4)
$1 = 0
(gdb) q
C'est ça!
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9215 4672 67% /
Nos 10 Mo sont les bienvenus :)
$ ls /proc/29351/fd
0 1 2 3
$ ps 29351
29351 pts/0 S+ 0:00 less /tmp/my10MBfile
Le processus est toujours en cours.
Cette commande affichera tous les fichiers supprimés encore ouverts sur un système Solaris:
find /proc/*/fd -type f -links 0
Vous pouvez tronquer ceux que vous êtes sûr de vouloir avec cette commande:
:> /proc/p/fd/x
avec p étant l'identifiant du processus et x le descripteur de fichier renvoyé par la première commande.
Ne vous inquiétez pas si avec certains programmes, la taille indiquée par ls
est restaurée à la taille avant la troncature après un certain temps, la taille réelle utilisée sur le disque sera beaucoup plus petite car le fichier est maintenant clairsemé.
Vous pouvez essayer d'accéder à /proc/<pid>/fd
répertoire et le descripteur de fichier correspondant tronqué. Disons que fd = 3 points pour le fichier supprimé de pid == 123:
# echo "" >! /proc/123/fd/3