2017-01-31 1 views
-2

Gibt es eine Möglichkeit in Python die Terminal-Standard zu entführen? Unix-Only-Lösungen werden gut funktionieren.Hijacking terminal stdin von python

Ich schreibe gerade einen kleinen Wrapper um top, wie ich benannte Prozesse, z. alle laufenden Python-Instanzen. Grundsätzlich rufe ich pgrep an, um Prozess-IDs zu erhalten, und läuft dann top unter Verwendung der -p Option.

Insgesamt hat dieses Skript seit ein paar Jahren zufriedenstellend funktioniert (gut mit der Einschränkung, dass top -p akzeptiert nur 20 PIDs ...). Allerdings möchte ich jetzt das Skript anpassen, um den Aufruf nach oben zu aktualisieren, wenn neue Prozesse mit dem Namensmuster geboren werden. Das funktioniert auch relativ gut, aber ... alle Optionen, die interaktiv in top gesetzt sind, gehen jedes Mal verloren, wenn ich die PID-Liste aktualisiere, aber natürliche Ursachen, wenn ich stoppe und top neu starte. Deshalb möchte ich die Terminal-Version irgendwie entführen, um die Auswirkungen der Einstellungen rückgängig zu machen, damit ich sie nach der Aktualisierung der PID-Liste entsprechend einstellen kann oder sogar die Aktualisierung bei Bedarf anhalten kann (zB wenn top weitere Anweisungen von erwartet der Benutzer).

jetzt vielleicht, was ich versuche zu erreichen ist einfach albern und es gibt bessere Möglichkeiten, es zu tun, wenn so würde ich sehr Erleuchtung schätzen

(oh. Den Tag ps als Tag verwendet wurde top tun nicht existiert und ich bin neue hier neue Tags zu definieren, nachdem alle zwei Dienstprogramme)

dank \

p verwandt sind
+0

Ich habe Probleme mit dieser Parsen. Über welche interaktiven Optionen sprichst du? Ich bin mir nicht sicher, was du mit "Backtrack" meinst. Was versuchst du über Stdin zu senden? Vielleicht ein Protokoll von dem, was du tust? Check out psutil https://pypi.python.org/pypi/psutil – RobertB

+0

Hallo Robert, vielleicht willst du auf der Manpage von 'top' nachlesen es ist nicht immer y – cpaitor

+0

Nicht wirklich was? Ich kenne Top. Ich versuche nur, deinen Beitrag zu lesen, und es ist verwirrend. – RobertB

Antwort

0

Was Sie klingt wie ein bisschen wie ein Hack tun. Ich würde einfach ein Python-Skript mit psutil schreiben, das genau das tut, was Sie wollen. Welche Informationen Sie auch interessieren, psutil sollte es Ihnen geben - und mehr.

Schnell und schmutzig:

import psutil 
import time  

while True: 
    processes = [ p for p in psutil.process_iter() if 'python' in p.name() ] 

    for p in processes: 
     # print out whatever information interests you 
     print(
       p.pid, 
       p.name(), 
       p.cpu_percent(), 
       p.io_counters().read_bytes, 
       p.io_counters().write_bytes 
       ) 
    time.sleep(10) 

Link zur Dokumentation: http://pythonhosted.org/psutil/