Lista de procesos en Linux a través de Python

Respuestas:

128

En mi opinión, mirar el /procsistema de archivos es menos desagradable que piratear la salida de texto 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
fuente
10
Tendrá que rodear la llamada read () con un bloque try / except, ya que un pid devuelto al leer os.listdir ('/ proc') puede que ya no exista en el momento en que lea la línea cmd.
Yanamon
4
¡Al final! ¡Validación! ¡Ahora puedo parar! :-)
bobince
5
-1 para / proc ya que no es portátil y hay mejores interfaces disponibles
Good Person
2
Cuidado: la línea de comando termina en 0x00. Los espacios en blanco también se reemplazan con el mismo carácter.
Federico
2
Solo use psutil: hace todo esto a través de una agradable interfaz Pythonic y es portátil si alguna vez desea ejecutar en un servidor que no sea Linux.
RichVel
83

¡Puede usar psutil como una solución independiente de la plataforma!

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]
entusiasmo
fuente
2
solo eche un vistazo a la documentación .
entusiasta el
¡Gracias por mencionar este tema! Paquete ordenado.
codekoala
5
No es completamente independiente de la plataforma: en OSX puede encontrar errores de AccessDenied
amos
@amos tiene algo de sentido: primero querrás tener privilegios antes de buscar información sobre los procesos. Gracias por la pista.
JSmyth
Para amplificar el punto OSX, necesita privilegios de root en OSX para obtener información del proceso, a diferencia de Linux.
RichVel
8

Puede utilizar una biblioteca de terceros, como PSI :

PSI es un paquete de Python que proporciona acceso en tiempo real a los procesos y otra información variada del sistema, como la arquitectura, el tiempo de arranque y los sistemas de archivos. Tiene una API pythonic que es coherente en todas las plataformas compatibles, pero también expone detalles específicos de la plataforma cuando es conveniente.

ars
fuente
2
PSI se actualizó por última vez en 2009, mientras que psutil se actualizó este mes (noviembre de 2015); parece que psutil es una mejor opción.
RichVel
7

La forma autorizada de crear y utilizar procesos secundarios es a través del módulo de subprocesos.

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

El comando se divide en una lista de argumentos de Python para que no sea necesario ejecutarlo en un shell (de forma predeterminada, el subproceso Popen no utiliza ningún tipo de entorno de shell, simplemente lo ejecuta). Debido a esto, no podemos simplemente suministrar 'ps -U 0' a Popen.

Mate
fuente
0

Me gustaría utilizar el subproceso módulo para ejecutar el comando pscon las opciones apropiadas. Al agregar opciones, puede modificar los procesos que ve. Muchos ejemplos de subprocesos en SO. Esta pregunta responde cómo analizar la salida de, pspor ejemplo :)

Como se muestra en una de las respuestas de ejemplo, también puede utilizar el módulo PSI para acceder a la información del sistema (como la tabla de procesos en este ejemplo ).

extraneón
fuente
-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
fuente