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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren