Liste des processus sous Linux via Python


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

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]

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.


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.


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 ).


-2
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
    print(lst[i])
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.