it-swarm.com.de

Wie erhalte ich die PID nach Prozessnamen?

Gibt es eine Möglichkeit, die PID über den Prozessnamen in Python zu erhalten?

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND                                                                                        
 3110 meysam    20   0  971m 286m  63m S  14.0  7.9  14:24.50 chrome 

Zum Beispiel muss ich 3110 durch chrome bekommen. 

29
Meysam

Sie können die PID von Prozessen über den Namen mit pidof durch subprocess.check_output erhalten:

from subprocess import check_output
def get_pid(name):
    return check_output(["pidof",name])


In [5]: get_pid("Java")
Out[5]: '23366\n'

check_output(["pidof",name]) führt den Befehl als "pidof process_name", aus. Wenn der Rückkehrcode ungleich Null war, wird ein CalledProcessError ausgelöst.

Um mehrere Einträge zu bearbeiten und in Ints umzuwandeln:

from subprocess import check_output
def get_pid(name):
    return map(int,check_output(["pidof",name]).split())

In [21]: get_pid ("chrome")

Out[21]: 
[27698, 27678, 27665, 27649, 27540, 27530, 27517, 14884, 14719, 13849, 13708, 7713, 7310, 7291, 7217, 7208, 7204, 7189, 7180, 7175, 7166, 7151, 7138, 7127, 7117, 7114, 7107, 7095, 7091, 7087, 7083, 7073, 7065, 7056, 7048, 7028, 7011, 6997]

Oder pas das -s-Flag, um eine einzelne PID zu erhalten:

def get_pid(name):
    return int(check_output(["pidof","-s",name]))

In [25]: get_pid("chrome")
Out[25]: 27698
46

Für Posix (Linux, BSD, etc ... muss nur das/proc-Verzeichnis angehängt werden), ist es einfacher, mit os-Dateien in /proc.Its reinem Python zu arbeiten, ohne dass Shell-Programme außerhalb aufgerufen werden müssen.

Funktioniert auf Python 2 und 3 (Der einzige Unterschied (2to3) ist der Exception-Baum, daher das " mit Ausnahme von Exception ", das ich nicht mag, aber die Kompatibilität beibehalten habe. Außerdem könnten benutzerdefinierte Ausnahmen erstellt werden.)

#!/usr/bin/env python

import os
import sys


for dirname in os.listdir('/proc'):
    if dirname == 'curproc':
        continue

    try:
        with open('/proc/{}/cmdline'.format(dirname), mode='rb') as fd:
            content = fd.read().decode().split('\x00')
    except Exception:
        continue

    for i in sys.argv[1:]:
        if i in content[0]:
            print('{0:<12} : {1}'.format(dirname, ' '.join(content)))

Beispielausgabe (es funktioniert wie pgrep):

phoemur ~/python $ ./pgrep.py bash
1487         : -bash 
1779         : /bin/bash
5
Fernando

sie können auch pgrep verwenden, in prgep können Sie auch Muster für die Übereinstimmung angeben

import subprocess
child = subprocess.Popen(['pgrep','program_name'], stdout=subprocess.PIPE, Shell=True)
result = child.communicate()[0]

sie können auch awk mit ps wie folgt verwenden

ps aux | awk '/name/{print $2}'
5
Hackaholic

Um die Antwort des Padraic zu verbessern: Wenn check_output einen Code ungleich Null zurückgibt, wird ein CalledProcessError ausgelöst. Dies geschieht, wenn der Prozess nicht vorhanden ist oder nicht ausgeführt wird.

Was ich tun würde, um diese Ausnahme zu erfassen, ist:

#!/usr/bin/python

from subprocess import check_output, CalledProcessError

def getPIDs(process):
    try:
        pidlist = map(int, check_output(["pidof", process]).split())
    except  CalledProcessError:
        pidlist = []
    print 'list of PIDs = ' + ', '.join(str(e) for e in pidlist)

if __== '__main__':
    getPIDs("chrome")

Die Ausgabe:

$ python pidproc.py
list of PIDS = 31840, 31841, 41942
4

Vollständiges Beispiel basierend auf dem ausgezeichneten @ Hackaholic's answer :

def get_process_id(name):
    """Return process ids found by (partial) name or regex.

    >>> get_process_id('kthreadd')
    [2]
    >>> get_process_id('watchdog')
    [10, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61]  # ymmv
    >>> get_process_id('non-existent process')
    []
    """
    child = subprocess.Popen(['pgrep', '-f', name], stdout=subprocess.PIPE, Shell=False)
    response = child.communicate()[0]
    return [int(pid) for pid in response.split()]
3

Wenn Ihr Betriebssystem eine Unix-Basis ist, verwenden Sie diesen Code:

import os
def check_process(name):
    output = []
    cmd = "ps -aef | grep -i '%s' | grep -v 'grep' | awk '{ print $2 }' > /tmp/out"
    os.system(cmd % name)
    with open('/tmp/out', 'r') as f:
        line = f.readline()
        while line:
            output.append(line.strip())
            line = f.readline()
            if line.strip():
                output.append(line.strip())

    return output

Dann nennen Sie es und geben Sie ihm einen Prozessnamen, um alle PIDs zu erhalten.

>>> check_process('firefox')
['499', '621', '623', '630', '11733']
0
Ali Hallaji

Da Python 3.5, subprocess.run () empfohlen wird über subprocess.check_output () :

>>> int(subprocess.run(["pidof", "-s", "your_process"], stdout=subprocess.PIPE).stdout)

Seit Python 3.7 können Sie auch das capture_output=true Parameter zum Erfassen von stdout und stderr:

>>> int(subprocess.run(["pidof", "-s", "your process"], capture_output=True).stdout)
0
Gohu