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?
files
open-files
rename
ripper234
quelle
quelle
Antworten:
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:
mv
wird diese untergeordnete Nummer nicht geändert, es sei denn, Sie verschieben sie zwischen Dateisystemen (was der Verwendung voncp
thenrm
auf dem Original entspricht).open
Datei 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:
open
eine Datei zum Lesen, aber erst dann tatsächlich lesen, wenn der Benutzerrm
sie in der Befehlszeile bearbeitet hat, und das Programm hat weiterhin Zugriff auf die Daten .mv
Wenn 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).open
eine Datei zum Schreiben bearbeitet hat und der Benutzerrm
den 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.open
. (Dies ist kein wirklicher Sicherheitsverstand, sondern verwandelt nur ein klaffendes Loch in einen Rennzustand.)quelle
open
eine Datei zum Lesen und Schreiben (wie es mit der Logdatei in der Frage geschehen ist).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.
quelle