Puisque vous avez dit qu'il s'agit d'un serveur Linux, appelez le ps externe le binaire est généralement plus lent, utilise plus de ressources et est plus sujet aux erreurs que l'utilisation des informations de /proc directement.
Puisque personne d'autre n'a mentionné, un moyen simple est :
glob.glob('/proc/[0-9]*/')
Bonne chance.
Pour démarrer/arrêter les sous-processus Python, vous pouvez utiliser le module subprocess. Pour vérifier s'ils sont en cours d'exécution, vous pouvez utiliser psutil :
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...ou ceci (il vérifiera également si le PID a été réutilisé) :
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
C'est ce que j'utilise. Il utilise procfs (vous êtes donc limité aux systèmes de type Unix, ne fonctionnera pas sur les macs, je pense) et le glob mentionné précédemment. Il obtient également la cmdline, qui vous permet d'identifier le processus. Pour tuer le processus, vous pouvez utiliser os.kill(signal.SIGTERM, pid)
. Pour utiliser un sous-processus, veuillez vérifier ce post Python, Popen et sélectionnez - en attente de la fin d'un processus ou d'un délai d'attente
def list_processes():
"""
This function will return an iterator with the process pid/cmdline tuple
:return: pid, cmdline tuple via iterator
:rtype: iterator
>>> for procs in list_processes():
>>> print procs
('5593', '/usr/lib/mozilla/kmozillahelper')
('6353', 'pickup -l -t fifo -u')
('6640', 'kdeinit4: konsole [kdeinit]')
('6643', '/bin/bash')
('7451', '/usr/bin/python /usr/bin/ipython')
"""
for pid_path in glob.glob('/proc/[0-9]*/'):
# cmdline represents the command whith which the process was started
f = open("%s/cmdline" % pid_path)
pid = pid_path.split("/")[2] # get the PID
# we replace the \x00 to spaces to make a prettier output from kernel
cmdline = f.read().replace("\x00", " ").rstrip()
f.close()
yield (pid, cmdline)
La vérification de la liste des processus en cours d'exécution est accomplie (même par des utilitaires de base comme "ps") en regardant le contenu du répertoire /proc.
En tant que tel, la bibliothèque qui vous intéresse pour interroger les processus en cours d'exécution est la même que celle utilisée pour travailler avec d'autres fichiers et répertoires (c'est-à-dire sys
ou os
, selon la saveur recherchée. Portez une attention particulière à os.path
cependant, il fait la plupart de ce que vous recherchez). Pour terminer ou interagir autrement avec les processus, vous leur envoyez des signaux, ce qui est accompli avec os.kill
. Enfin, vous démarrez de nouveaux processus en utilisant os.popen
et amis.