web-dev-qa-db-fra.com

Fermer le fichier ouvert sans tuer le processus

Java (Yeah Java ...) Application fonctionnant sur Centos 7. Après un certain temps, il existe de nombreux fichiers "supprimés" qui me dérangent.

pour les fichiers supprimés utilisés (pas le problème):

lsof | grep "(deleted)"

Je les ai trouvés dans/proc/pid/fd/... et ma question est de savoir comment puis-je tuer/les supprimer sans tuer le processus (processus doit être exécuté 24/7).

J'ai vu sur Google que je peux utiliser l'outil GDB, mais je ne sais pas comment l'utiliser. Pouvez-vous m'aider s'il vous plaît (juste pour écrire un manuel étape par étape)?

J'aimerai entendre d'autres suggestions si vous avez.

7
igor

utilisez lsof -p $PID et trouvez le descripteur de fichier (4ème colonne)

root@blah:~# lsof -p 1737 | grep "(deleted)" Apache2 1737 root 6w REG 0,25 0 207401 (deleted)/var/log/Apache2/other_vhosts_access.log

La 4ème colonne est de 6W, ce qui signifie le descripteur de fichier 6 et il a été ouvert pour l'écriture (W).

Puis:

gdb -p $PID p close($FD)

par exemple:

gdb -p 1737 ..... (gdb) p close(6) $1 = 0 ... Quit anyway? (y or n) y Detaching from program: /usr/lib/Apache2/mpm-prefork/Apache2, process 1737

12
damolp

Utilisez la commande suivante pour trouver les descripteurs de fichiers de fichiers supprimés et vous pouvez les tronquer ensuite ensuite

trouver/proc/-mindepth 3 -MaxDepth 3\-regex '/ proc/[1-9] [0-9] / FD/[1-9] [0-9]' -TYPE l -lname '* (supprimé)'\-printf '% p\n% l\n' 2>/dev/null

0
kashminder