truncate -s 0 funktioniert nicht richtig auf geöffneter Textdatei
-
Hi, ich hab, sagen wir, eine Anwendung/Programm, das alle 10 Sekunden etwas etwas auf der Standardausgabe ausgibt (die Log-Datei wächst also schnell auf mehrere MB an):
./program1
Die Ausgabe des Programms leite ich in eine Log-Datei um:
./program1 > my-log-1.txt
das starte ich in screen, und anschließend detache ich screen (das Programm läuft dann weiter).
Jetzt starte ich zum Beispiel jede Minute mit einem crontab ein Script, dass die Log-Datei lesen, etwas damit machen und anschließend leeren soll, aber der Befehl:
truncate -s 0 my-log-1.txt
funktioniert nur kurz, denn
ls -last
zeigt zwar kurz die file size 0 an, aber wenn program1 die nächste Ausgabe erzeugt, dann hat die Log-Datei wieder ihre ursprüngliche file size.Wie behebe ich das?
-
Ich verstehe das Problem, und es könnte entweder ganz einfach sein oder Trickserei benötigen. Die ganz einfache Lösung, die hoffentlich funktioniert, wäre es die Pipe an die Datei anhängen zu lassen:
./program1 >> my-log-1.txt
So sollte der Dateizeiger in der Pipe nicht an eine absolute Position schreiben, sondern an eine Position relativ zum Ende. Und das sollte dann auch funktionieren, wenn das Ende sich zwischendurch ändert.Falls das nicht funktioniert, wird's schwierig.
-
Feine Sache, mit
>>
funktioniert es.Ich danke dir.
Die Erklärung, dass die Dateinzeigerpostion bei
>>
"immer" auf das aktuelle Ende der Datei gesetzt wird, hast du ja schon gegeben.
-
@SeppJ Das ist i-wie doch suboptimal, denn nach einigen Tagen braucht das System immer mehr RAM...
Ich hab nun
stdout
nach/dev/null
umgeleitet, weil mich die Ausgaben doch nicht interessieren und weil das Programm, was ich aber erst nicht wusste, ohnehin Log-Dateien anlegt und diese auch log-rotated.
-
@SeppJ Ach nein, es liegt doch nicht am
>>
... Das Programm braucht nach einiger Zeit einfach immer mehr Speicher, auch wenn ich nach/dev/null
umleite... Ich hab das jetzt ein paar Tage lang beobachtet.Aber ungeachtet dessen ist dieses Thema eigentlich schon done.