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
.
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
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
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}'
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
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()]
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']