Wie verhalten sich geöffnete Dateien auf Linux-Systemen?


17

Ich habe gerade eine Protokolldatei in "foo.log.old" umbenannt und bin davon ausgegangen, dass die Anwendung mit dem Schreiben einer neuen Protokolldatei unter "foo.log" beginnt. Ich war überrascht zu entdecken, dass es die Protokolldatei auf ihren neuen Namen verfolgte und weiterhin Zeilen an "foo.log.old" anhängte.

In Windows bin ich nicht mit dieser Art von Verhalten vertraut - ich weiß nicht, ob es überhaupt möglich ist, es zu implementieren. Wie genau ist dieses Verhalten in Linux implementiert? Wo kann ich mehr darüber erfahren?


Ich stelle dies nicht als Antwort dar, weil ich es nicht wirklich weiß, aber ich denke, es hat damit zu tun, dass die Inodes beim Verschieben einer Datei nicht geändert werden.
Mathepic

Antworten:


20

Programme stellen eine Verbindung zu Dateien über eine Nummer her, die vom Dateisystem verwaltet wird (auf herkömmlichen Unix-Dateisystemen als Inode bezeichnet), auf die der Name nur eine Referenz ist (und möglicherweise keine eindeutige Referenz).

Es gibt also einige Dinge zu beachten:

  1. Durch das Verschieben einer Datei mit mvwird diese untergeordnete Nummer nicht geändert, es sei denn, Sie verschieben sie zwischen Dateisystemen (was der Verwendung von cpthen rmauf dem Original entspricht).
  2. Da mehr als ein Name eine Verbindung zu einer einzelnen Datei herstellen kann (dh wir haben feste Verknüpfungen), verschwinden die Daten in "gelöschten" Dateien erst, wenn alle Verweise auf die untergeordnete Datei verschwinden.
  3. Vielleicht das Wichtigste: Wenn ein Programm eine openDatei ist, verweist es darauf, was (zum Zwecke des Löschens der Daten) einem Dateinamen entspricht, mit dem es verbunden ist.

Dies führt zu verschiedenen Verhaltensweisen wie:

  • Ein Programm kann openeine Datei zum Lesen, aber erst dann tatsächlich lesen, wenn der Benutzer rmsie in der Befehlszeile bearbeitet hat, und das Programm hat weiterhin Zugriff auf die Daten .
  • Das Problem, auf das Sie gestoßen sind: mvWenn Sie eine Datei öffnen, wird die Beziehung zwischen der Datei und den Programmen, in denen sie geöffnet ist, nicht getrennt (es sei denn, Sie überschreiten Dateisystemgrenzen. In diesem Fall verfügt das Programm noch über eine Version des Originals, an der Sie arbeiten können).
  • Wenn ein Programm openeine Datei zum Schreiben bearbeitet hat und der Benutzer rmden letzten Dateinamen in der Befehlszeile hat, kann das Programm weiterhin Daten in die Datei einfügen. Sobald es geschlossen wird, wird jedoch nicht mehr auf diese Daten und verwiesen es wird weggehen.
  • Zwei Programme, die über eine oder mehrere Dateien kommunizieren, können eine grobe Teilsicherheit erzielen, indem sie die Datei (en) nach Beendigung entfernen open. (Dies ist kein wirklicher Sicherheitsverstand, sondern verwandelt nur ein klaffendes Loch in einen Rennzustand.)

1
Ich stimme mit @dmckee überein, ich wollte nur festhalten: Ein Programm kann openeine Datei zum Lesen und Schreiben (wie es mit der Logdatei in der Frage geschehen ist).
Jsbillings

@jsbillings: Ja, aber es besteht ein Risiko. Wenn alle Dateisystemnamen weg sind, können Sie GBs in eine geöffnete Datei schreiben, die wie der Morgentau verdunstet, sobald Sie sie schließen.
dmckee

1
Außerdem wird der Inode in den Kernel kopiert und das ist es, woran gearbeitet wird, nicht die Festplattenkopie. Die Datei könnte also mv'd oder cp 'sein, aber eine geöffnete Datei funktioniert bereits mit den Kerndatenstrukturen, nicht mit der Festplattenversion. Wenn Sie also eine andere Datei in die Datei kopieren, die zum Schreiben geöffnet ist, schreibt der Prozess weiterhin an dieselbe relative Position wie in der alten Datei. Aus diesem Grund verfügen Programme wie Apache httpd über einen Signalhandler, der die Protokolldateien schließt und erneut öffnet.
Arcege

0

Um wirklich zu sehen, wie dieses Verhalten implementiert ist, können Sie sich einige Unix-Programmierbücher ansehen. Mathepic hat insofern Recht, als es sich um eine Inode handelt. Der tatsächliche Pfadname wird nur verwendet, um die Datei zu öffnen, nachdem das Programm anhand des geöffneten Dateideskriptors darauf verwiesen hat. Der Dateideskriptor verweist wiederum auf den Inode. In diesem Fall ist es egal, ob sich der zugrunde liegende Dateiname geändert hat.

Soweit dies in Windows implementiert ist, ist dies eine Frage für eine andere Site.

Um mehr darüber zu lesen, ohne auf die Bücher zu stoßen, suchen Sie einfach nach Linux-Dateisystemen und -Inodes. Möglicherweise gibt es keine eindeutige Antwort, aber Sie werden verstehen, warum.


4
"Suche dich um - du wirst wahrscheinlich keine gute Antwort finden, aber sie verstehen" ist keine gute Antwort.
Mattdm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.