Geöffnete Datei schließen, ohne den Prozess zu beenden

20300
igor

Ich habe Java (yeah java ...) Anwendung, die auf CentOS 7 ausgeführt wird. Nach einer Weile gibt es viele "gelöschte" Dateien, die mich stören.

für gelöschte Dateien (nicht das Problem):

lsof | grep "(deleted)" 

Ich habe sie in / proc / pid / fd / ... gefunden und meine Frage ist, wie ich sie töten / löschen kann, ohne den Prozess zu beenden (Prozess muss 24/7 ausgeführt werden).

Ich habe bei Google gesehen, dass ich das gdb-Tool verwenden kann, aber ich weiß nicht, wie ich es verwenden soll. Können Sie mir bitte helfen (nur Schritt für Schritt Handbuch)?

Ich würde gerne andere Vorschläge hören, wenn Sie haben.

5
@ user20574 Wenn ein anderes Programm in die Datei geschrieben hat und das Handle daran verloren ging, ist es offensichtlich, dass dies zu einer Beschädigung der Datei führen würde. Glimpse vor 6 Jahren 0
@Glimpse na ja, aber nur zu der Datei, die du zwangsweise geschlossen hast. Es ist nicht offensichtlich, dass * andere Dateien zufällig * beschädigt werden. user20574 vor 6 Jahren 0

1 Antwort auf die Frage

7
damolp

Benutze lsof -p $PIDund finde den Dateideskriptor (4. Spalte)

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

Die vierte Spalte ist 6w, was den Dateideskriptor 6 bedeutet und zum Schreiben geöffnet wurde (w).

Dann:

gdb -p $PID p close($FD)

z.B:

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

DANKE, endlich eine gute einfache Antwort! Übrigens, alle meine Prozesse haben 'x'u in der vierten Spalte. Was bedeutet "u"? igor vor 9 Jahren 0
"u" bedeutet, dass der Dateideskriptor beim Lesen und Schreiben geöffnet ist damolp vor 9 Jahren 0