Forum: PC-Programmierung fatrace in Python3 mit subprocess.Popen


von Sven (Gast)


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

von Norbert (Gast)


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.

von Norbert (Gast)


Lesenswert?

Eventuell mal mit ›stdbuf‹ starten. Zeilenpuffer oder auch gar keiner.

von Sven (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.