web-dev-qa-db-fra.com

Comment obtenir un PID par nom de processus?

Est-il possible d'obtenir le PID par nom de processus en Python?

  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 

Par exemple, je dois obtenir 3110 par chrome

29
Meysam

Vous pouvez obtenir le pid des processus par leur nom en utilisant pidof via subprocess.check_output :

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]) lancera la commande sous la forme "pidof process_name", Si le code de retour était différent de zéro, il déclenche une CalledProcessError.

Pour gérer plusieurs entrées et transtyper en ints:

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

Dans [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]

Ou passez le drapeau -s pour obtenir un seul pid:

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

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

Pour posix (Linux, BSD, etc ... n'a besoin que du répertoire/proc pour être monté), il est plus facile de travailler avec des fichiers os dans /proc.Son python pur, pas besoin d'appeler des programmes Shell à l'extérieur.

Fonctionne sur python 2 et 3 (la seule différence (2to3) est l'arbre d'exception, donc le " sauf Exception ", que je n'aime pas mais que je garde pour maintenir la compatibilité. Peut également avoir créé une exception personnalisée.)

#!/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)))

Exemple de sortie (cela fonctionne comme pgrep):

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

vous pouvez également utiliser pgrep, dans prgep vous pouvez également donner un motif pour la correspondance

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

vous pouvez aussi utiliser awk avec ps comme ceci

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

Pour améliorer la réponse de Padraic: lorsque check_output renvoie un code différent de zéro, il déclenche une CalledProcessError. Cela se produit lorsque le processus n'existe pas ou n'est pas en cours d'exécution.

Ce que je ferais pour attraper cette exception est:

#!/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")

Le résultat:

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

Exemple complet basé sur l'excellent @ 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
Dennis Golomazov

Si votre système d'exploitation est basé sur Unix, utilisez ce 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

Puis appelez-le et transmettez-lui un nom de processus pour obtenir tous les PID.

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