perl: während dem einlesen einer datei zeilen löschen


renslow

Grünschnabel
Hallo,

ich finde nichts zu folgendem Thema. Wäre nett, wenn mir dabei jemand helfen könnte.
Das Problem allgemein:
Ein Syslog-Server schreibt in eine Datei rein. Diese Datei will ich mit einem Perl-Skript auswerten. Damit die Festplatte nicht überläuft, lasse ich logrotate laufen, um von der Datei, in die reingeschrieben wird, ein komprimiertes Backup zu machen und sie neu anzulegen. Sobald logrotate dies tut, hört mein Skript auf, die Datei auszuwerten.
Das einlesen der Datei geschieht im Skript mit dem Standard-Befehl open(...). Die Datei wird permanent offen gehalten, wird keine neue Zeile in die Datei geschrieben, schläft das Skript eine Sekunde lang.

Ich bräuchte entweder eine Lösung, bei der mein Skript nicht aufhört, die Datei auszuwerten, obwohl logrotate die Datei (die vom Skript noch offengehalten wird) kurzzeitig löscht und neu anlegt.

Oder als alternative Lösung:
Wie kann ich, nachdem ich eine Zeile (die vom Syslog in die Datei geschrieben wurde) ausgewertet habe, ebendiese Zeile aus der Datei löschen? Damit könnte ich mir logrotate sparen.
Meine Skills, was Perl und Zeilen einer Datei löschen angeht, beschränken sich auf "Datei in Array einlesen"->"Zeile aus Array löschen"->"Array in Datei schreiben" Was aber hier ja leider nicht anwendbar ist.

Vielen Dank im voraus.
 

Enumerator

Mitglied Kamel
moin!

dein grundlegendes problem ist die funktion, die du verwendest um dateien zu öffnen: open(); ist ungeeignet für so ziemlich alles - ausser wenn man mal eben ein skript schreibt das nicht allzu oft (oder nie wieder) gebraucht wird...
sysopen(); ist die funktion die du brauchst: du kannst viel expliziter festlegen, welches verhalten dein filehandle an den tag legen soll. die dafür nötigen konstanten (mode-parameter) sind im modul Fcntl... viel erfolg!

gruß
enum
 

Neue Beiträge