fatrace in Python3 mit subprocess.Popen

Gast #6798062
Lesenswert?
• ▲
▼
Hi zusammen

ich versuche gerade `fatrace` in meinem python script einzubinden um 
kontinuierlich gewisse Zugriffe zu überwachen.

Hier macht mir aber die Implementierung von fatrace ein Problem, denn es 
wird anscheinend nicht wie vergleichweise bei `ping` Zeile für Zeile an 
stdout übergeben.

Als Beispiel:
1
fatrace --filter=OC
gibt alles ordentlich auf der Konsole aus, aber
1
fatrace --filter=OC | cat
bleibt leer...

Doch genau das selbe Problem entsteht leider auch wenn ich es in python 
versuche nach dem folgenden Schema:
1
proc = subprocess.Popen(["fatrace", "--filter=OC"], stdout=subprocess.PIPE)
2
fcntl.fcntl(proc.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
3
while proc.poll() is None:
4
    print("Received: ", proc.stdout.read())
5
    time.sleep(1)
Hierbei erhalte ich nur leere "Received: " auf der Konsole. Versuche ich 
es hingegen mit einem `ping`, erscheint Zeile für Zeile hinter 
"Received: ...".

Aktueller work-around ist alle 15s ein neues fatrace zu starten, damit 
ich stdout nach der verstrichenen Zeit anständig auslesen kann, aber 
immer einen neuen Prozess zu starten scheint mir auch nicht DIE Lösung 
zu sein...

Hat jemand eine Idee dafür? Oder weiss jemand wieso der output von einem 
"nackten" `fatrace` dennoch anständig auf der Konsole ausgegeben wird 
trotz dass stdout lange Zeit leer bleibt?

lg Sven
Gast #6798200
Lesenswert?
• ▲
▼
Sven schrieb:
> Hi zusammen
> Doch genau das selbe Problem entsteht leider auch wenn ich es in python
> versuche nach dem folgenden Schema:proc = subprocess.Popen(["fatrace",
> "--filter=OC"], stdout=subprocess.PIPE)
> fcntl.fcntl(proc.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
> while proc.poll() is None:
>     print("Received: ", proc.stdout.read())
>     time.sleep(1)
> Hierbei erhalte ich nur leere "Received: " auf der Konsole. Versuche ich
> es hingegen mit einem `ping`, erscheint Zeile für Zeile hinter
> "Received: ...".

Könnte mir vorstellen das es gepuffert wird und die Pipe erst etwas 
sieht wenn mehr als zB. 4096Byte gesendet wurden.
Gast #6798307
Lesenswert?
• ▲
▼
Norbert schrieb:
> Eventuell mal mit ›stdbuf‹ starten. Zeilenpuffer oder auch gar
> keiner.

Tatsächlich! Interessanterweise funktioniert es aber auch nur auf diese 
Variante, denn mit
1
subprocess.Popen(["fatrace", "--filter=OC"], bufsize=1,
2
                 universal_newlines=True, stdout=subprocess.PIPE)
geht es nicht, obwohl dies nach meinem Verständnis das selbe machen 
sollte.

Danke dir, Fall ist somit gelöst!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.