truncate -s 0 funktioniert nicht richtig auf geöffneter Textdatei


  • Gesperrt

    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?


  • Mod

    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.


  • Gesperrt

    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.


  • Gesperrt

    @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.


  • Gesperrt

    @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.


Anmelden zum Antworten