Gibt es eine Möglichkeit, um sicherzustellen, dass Programme, die versuchen, seek()
Operationen an einer Named Pipe auszuführen, erfolgreich zurückkehren (aber so tun, als ob die Pipe eine leere Datei wäre), anstatt 'Illegal seek'?
Ich habe auf meinem System jedes noch so kleine Protokoll in einer SQLite-Datenbank gespeichert, ich habe nirgendwo Dateien. Es gibt jedoch einige Programme, die Probleme damit haben. Es gibt 2 spezielle Fälle;
- Ein Programm möchte in eine Protokolldatei schreiben, die syslog-ng als Named Pipe erstellt hat und aus der es liest. Das Programm möchte
seek()
aus irgendeinem Grund eine ausführen und schlägt dann fehl. - Ein Programm (wie denyhosts oder fail2ban) möchte aus einer Protokolldatei lesen, die syslog-ng als Named Pipe erstellt hat und in die geschrieben wird. Das Programm möchte einen ausführen
seek()
und schlägt fehl.
Idealerweise möchte ich, dass sich diese Suchanfragen so verhalten, als ob die Named Pipe nur eine leere Datei wäre. Ich kann keinen Grund erkennen, warum ein Programm, das ein Protokoll schreibt, ohnehin eine Suche durchführen müsste. Es sollte nur die Datei zum Anhängen öffnen und mit dem Schreiben beginnen. Ich kann sehen, warum ein Programm das Lesen suchen möchte, damit es von seiner letzten Position aus fortgesetzt werden kann, und ich möchte, dass es sich so verhält, als ob die Datei leer wäre (als ob sie abgeschnitten worden wäre).
Gibt es also eine Option, die für Named Pipes festgelegt werden kann, damit sie sich so verhalten? Wenn nicht, gibt es einen Modus, der eingestellt werden kann, wenn syslog-ng die Pipe öffnet, damit sich diese so verhält (ich bin offen für Codeänderungen)? Oder bin ich einen Bach hoch?
F
Befehls in less würde es für less ausreichen, den Bildschirm zu aktualisieren, wenn er etwa eine Sekunde lang keine Ausgabe erhält. Pipes suchbar zu machen, hilft nichts: Der relevante Unterschied besteht darin, dass sieF
bis zum Ende der Datei reichen und dann darauf warten, dass Daten nach dem Ende angezeigt werden. Bei Pipes kommt das Dateiende jedoch erst, wenn der Writer die Datei schließt.Wenn die Anwendung seek aufruft, ist sie entweder defekt oder soll nicht mit Pipes arbeiten. Wenn das erstere, dann muss es behoben werden. Wenn letzteres der Fall ist, erwartet es, dass die Suche tatsächlich funktioniert. Wenn Sie also lügen und behaupten, dass sie funktioniert hat, wenn dies nicht der Fall ist, wird dies mit ziemlicher Sicherheit zu einer Fehlbedienung führen.
Auch wenn die Protokolldatei durch eine Named Pipe ersetzt wird, kann jeweils nur ein Prozess daraus lesen. Es sollte stattdessen eine Steckdose sein.
quelle