Änderungsbeschreibung beim Umbenennen der Datei Linux

949
zogby

Ich habe in CentOS ein Programm bekommen, das sein Log in eine Datei schreibt. Wenn ich es umbenenne, schreibt das Programm immer noch dazu. Gibt es eine Möglichkeit, diesen Dateideskriptor zu ändern, ohne das Programm neu zu starten?

-1
Bitte [bearbeiten] Sie Ihre Frage und geben Sie einige Details an. Was ist dieser Prozess? Ist es ein Skript? Können Sie das Umbenennen im Skript / Programm durchführen? Warum müssen Sie eine Datei umbenennen, in die überhaupt geschrieben wird? Wie genau schreibt dieser Prozess in die Datei? terdon vor 10 Jahren 1
Können Sie das Umbenennen im Skript / Programm durchführen? - Nein, ich kann nicht. Warum müssen Sie eine Datei umbenennen, in die überhaupt geschrieben wird? - Ich muss dringend eine Sicherungskopie der Protokolldateien erstellen, aber ich kann den Prozess nicht stoppen, der sie schreibt. zogby vor 10 Jahren 0
Bitte _ [Bearbeiten] _ Ihren Beitrag, um neue Informationen hinzuzufügen. Es ist schwer zu lesen und in den Kommentaren leicht zu übersehen. Das ist noch unklar. Wenn Sie eine Sicherungskopie benötigen, kopieren Sie die Datei einfach an eine andere Stelle, und Sie müssen nichts anhalten. Wenn Sie es umbenennen, wie schreibt der Prozess noch dazu? Ist das eine Named Pipe? Eine harte Verbindung? Wir können Ihnen nur helfen, wenn Sie weitere Details hinzufügen (indem Sie Ihre Frage bearbeiten). terdon vor 10 Jahren 0
@terdon Sorry, ich verstehe nicht, was unklar ist. Irgendwie schreibt der Prozess immer noch in eine Datei, obwohl ich sie umbenannt habe. Ich muss eine Sicherung aus dieser Protokolldatei erstellen und diese Protokolldatei leeren. zogby vor 10 Jahren 0
Sie haben erst jetzt erwähnt, dass Sie die Datei löschen müssen. Sie haben nicht erklärt, warum eine einfache "mv logfile logfile.bak" nicht ausreicht. Wollen Sie damit sagen, dass der Prozess weiterhin an "logfile.bak" schreibt? Das ist meines Wissens nicht möglich. Es wird einfach "Logfile" neu erstellt und schreibt weiter. Wenn dies alles nicht stimmt, müssen Sie uns genau sagen, welcher Prozess und welches Dateisystem verwendet wird, und ein reproduzierbares Beispiel geben, da Sie etwas sehr Merkwürdiges beschreiben. terdon vor 10 Jahren 0

1 Antwort auf die Frage

2
JdeBP

Irgendwie schreibt der Prozess immer noch in eine Datei, obwohl ich sie umbenannt habe.

Dies wird als Normalbetrieb des Betriebssystems bezeichnet . Sobald die Datei geöffnet ist, ist es für die Prozesse mit dem geöffneten Dateideskriptor egal, welchen Namen die Datei hat oder ob die Datei überhaupt einen Namen hat.

Einfach ausgedrückt, das Protokollierungsschema Ihres Programms (wenn es wirklich das ist, was es ist) ist sophomorisch. Sie erfahren genau, warum es Sophomoric ist. Diese Datei wird für immer wachsen und wachsen, solange das Programm, das das Protokoll generiert, weiter ausgeführt wird, bis der gesamte für den Benutzer zur Verfügung stehende Speicherplatz belegt ist. (Heaven hilft Ihnen, wenn Ihr Programm als Superuser ausgeführt wird.) Wenn Sie die Verknüpfung der Datei aufheben, frisst das Programm den Speicherplatz auf unbestimmte Zeit, da die Datei ohne Namen auf der Disc vorhanden ist, bis der letzte geöffnete Dateideskriptor geschlossen wird. Es ist nicht möglich, die Protokolldatei zu drehen oder die Dateiposition des geöffneten Dateideskriptors von außerhalb des Programms selbst zurückzusetzen. Daher funktioniert auch das Abschneiden nicht, da das Programm weiterhin von seiner letzten Position aus schreibtdiese Person entdeckt .

Sie können jetzt nichts tun, wenn Sie keinen Debugger anhängen, bis das Programm beendet ist. Weisen Sie das Programm das nächste Mal an, sich bei seinem Standardfehler oder seiner Standardausgabe anzumelden, sofern dies überhaupt möglich ist. Dann sendet diese Standardfehler / Standardausgabe über eine Leitung mit einem Programm wie multilog, multilog, s6-log, svlogd, tinylog, oder cyclog. Sie erhalten einen Satz von Protokolldateien, deren Größe begrenzt ist, automatisch zykliert und bei Bedarf drehbar ist.

Eine minderwertige Vorgehensweise beim nächsten Mal ist das Öffnen der Datei im Anfügemodus. Sie müssen das Protokoll kopieren und abschneiden, da das Drehen durch Umbenennen der Datei immer noch nicht funktioniert. Und natürlich besteht die Gefahr, dass Protokolldaten verloren gehen, wie in der logrotateManpage beschrieben wird, da sich zwischen dem Erstellen der Kopie und dem Abschneiden der Datei die Gelegenheit ergibt. Im Gegensatz dazu verlieren die oben genannten Protokollierungswerkzeuge keine Protokolldaten an unvorhersehbaren Punkten aufgrund der Protokollrotation durch newsyslogoder logrotate(die man nicht benötigt und nicht verwendet). Verwenden Sie sie in Verbindung mit einem Prozess-Supervisor, der die Pipe offen hält, und sie verlieren auch keine Protokolldaten, wenn der Logger neu konfiguriert und neu gestartet wird.