2017-10-27 4 views
0

In meinem Python-Skript möchte ich überprüfen, ob otherscript.py derzeit auf dem (Linux) -System ausgeführt wird. Die psutil Bibliothek sah aus wie eine gute Lösung:Finden Sie Prozesse per Befehl in Python

import psutil 
proc_iter = psutil.process_iter(attrs=["name"]) 
other_script_running = any("otherscript.py" in p.info["name"] for p in proc_iter) 

Das Problem ist, dass p.info["name"] nur den Namen der ausführbaren Datei eines Prozesses gibt, nicht den vollen Befehl. Wenn also python otherscript.py auf dem System ausgeführt wird, ist p.info["name"] nur python für diesen Prozess, und mein Skript kann nicht erkennen, ob otherscript.py das Skript ausgeführt wird oder nicht.

Gibt es eine einfache Möglichkeit, diese Überprüfung mit psutil oder einer anderen Bibliothek durchzuführen? Ich weiß, ich könnte den ps Befehl als Subprozess ausführen und nach dem otherscript.py in der Ausgabe suchen, aber ich würde eine elegantere Lösung bevorzugen, wenn eine existiert.

Antwort

1

Ich frage mich, ob das funktioniert

import psutil 
proc_iter = psutil.process_iter(attrs=["pid", "name", "cmdline"]) 
other_script_running = any("otherscript.py" in p.info["cmdline"] for p in proc_iter) 
1

http://psutil.readthedocs.io/en/latest/#find-process-by-name Werfen Sie einen Blick das zweite Beispiel auf die Namen() prüft, cmdline() und exe().

Zum Vergleich:

import os 
import psutil 

def find_procs_by_name(name): 
    "Return a list of processes matching 'name'." 
    ls = [] 
    for p in psutil.process_iter(attrs=["name", "exe", "cmdline"]): 
     if name == p.info['name'] or \ 
       p.info['exe'] and os.path.basename(p.info['exe']) == name or \ 
       p.info['cmdline'] and p.info['cmdline'][0] == name: 
      ls.append(p) 
    return ls 
Verwandte Themen