Liste des processus sous Linux via Python

91

Comment puis-je obtenir la liste des processus en cours d'exécution à l'aide de Python sur Linux?

Madzombie
la source
1
Vous pouvez utiliser le module de sous-processus: andreinc.net/2010/11/07/…
Andrei Ciobanu

Réponses:

128

IMO regarder le /procsystème de fichiers est moins désagréable que de pirater la sortie texte de ps.

import os
pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]

for pid in pids:
    try:
        print open(os.path.join('/proc', pid, 'cmdline'), 'rb').read().split('\0')
    except IOError: # proc has already terminated
        continue
bobince
la source
10
Vous devrez entourer l'appel read () d'un bloc try / except car un pid renvoyé par la lecture de os.listdir ('/ proc') peut ne plus exister au moment où vous lisez la cmdline.
Yanamon le
4
Enfin! Validation! Maintenant je peux m'arrêter! :-)
bobince
5
-1 pour / proc car ce n'est pas portable et il y a de meilleures interfaces disponibles
Good Person
2
Attention: la ligne de commande se termine par 0x00. Les espaces sont également remplacés par le même caractère.
Federico
2
Il suffit d'utiliser psutil- il fait tout cela via une belle interface Pythonic et est portable si vous voulez un jour tourner sur un serveur non Linux.
RichVel
83

Vous pouvez utiliser psutil comme solution indépendante de la plate-forme!

import psutil
psutil.pids()

[1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 
4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358, 
4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235, 
5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
enthousiaste
la source
2
jetez un œil à la documentation .
enthousiaste
Merci d'avoir soulevé cela! Paquet soigné.
codekoala
5
Ce n'est pas complètement indépendant de la plate-forme - sur OSX, vous pouvez rencontrer des erreurs AccessDenied
amos
@amos a un peu de sens - vous voudriez d'abord avoir des privilèges avant de contacter des informations sur les processus. Merci pour l'indice.
JSmyth
Pour amplifier le point OSX, vous avez besoin des privilèges root sur OSX pour obtenir des informations sur les processus, contrairement à Linux.
RichVel
8

Vous pouvez utiliser une bibliothèque tierce, telle que PSI :

PSI est un package Python fournissant un accès en temps réel aux processus et à d'autres informations système diverses telles que l'architecture, le temps de démarrage et les systèmes de fichiers. Il dispose d'une API pythonique qui est cohérente sur toutes les plates-formes prises en charge, mais expose également des détails spécifiques à la plate-forme lorsque cela est souhaitable.

ars
la source
2
PSI a été mis à jour pour la dernière fois en 2009, alors que psutil a été mis à jour ce mois-ci (novembre 2015) - il semble que psutil soit un meilleur pari.
RichVel
7

La manière autorisée de créer et d'utiliser des processus enfants consiste à utiliser le module de sous-processus.

import subprocess
pl = subprocess.Popen(['ps', '-U', '0'], stdout=subprocess.PIPE).communicate()[0]
print pl

La commande est décomposée en une liste d'arguments python afin qu'elle n'ait pas besoin d'être exécutée dans un shell (par défaut, le sous-processus.Popen n'utilise aucun type d'environnement shell, il l'exécute uniquement). Pour cette raison, nous ne pouvons pas simplement fournir «ps -U 0» à Popen.

Mat
la source
0

J'utiliserais le module de sous - processus pour exécuter la commande psavec les options appropriées. En ajoutant des options, vous pouvez modifier les processus que vous voyez. Beaucoup d'exemples de sous-processus sur SO. Cette question explique comment analyser la sortie de pspar exemple :)

Vous pouvez, comme l' un des exemples de réponses montrés, également utiliser le module PSI pour accéder aux informations système (comme la table de processus dans cet exemple ).

extraneon
la source
-2
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
    print(lst[i])
Manivannan Murugavel
la source