vous pouvez également utiliser pgrep
, en prgep
vous pouvez également donner un modèle pour le match
import subprocess
child = subprocess.Popen(['pgrep','program_name'], stdout=subprocess.PIPE, shell=True)
result = child.communicate()[0]
vous pouvez également utiliser awk
avec ps comme ça
ps aux | awk '/name/{print $2}'
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])
exécutera la commande en tant que "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 convertir en entiers :
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 -s
flag 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'ont besoin que du répertoire /proc pour être monté), il est plus facile de travailler avec des fichiers os dans /proc. C'est du pur python, pas besoin d'appeler des programmes shell à l'extérieur.
Fonctionne sur python 2 et 3 ( La seule différence (2to3) est l'arborescence des exceptions, donc le "except Exception ", que je n'aime pas mais que j'ai conservé pour maintenir la compatibilité. J'aurais également pu créer 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 (il fonctionne comme pgrep) :
phoemur ~/python $ ./pgrep.py bash
1487 : -bash
1779 : /bin/bash
Vous pouvez utiliser psutil
paquet :
Installer
pip install psutil
Utilisation :
import psutil
process_name = "chrome"
pid = None
for proc in psutil.process_iter():
if process_name in proc.name():
pid = proc.pid