Elenco dei processi su Linux tramite Python


Risposte:


128

IMO guardare il /procfilesystem è meno fastidioso che hackerare l'output di testo di 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
Dovrai racchiudere la chiamata read () con un blocco try / tranne poiché un pid restituito dalla lettura os.listdir ('/ proc') potrebbe non esistere più nel momento in cui leggi la cmdline.
Yanamon

4
Alla fine! Validazione! Adesso posso smettere! :-)
bobince

5
-1 per / proc poiché non è portatile e sono disponibili interfacce migliori
Good Person

2
Attenzione: la riga di comando viene terminata da 0x00. Anche gli spazi bianchi vengono sostituiti con lo stesso carattere.
Federico

2
Basta usare psutil: fa tutto questo attraverso una bella interfaccia Pythonic ed è portatile se vuoi funzionare su un server non Linux.
RichVel

83

Potresti usare psutil come soluzione indipendente dalla piattaforma!

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
basta dare un'occhiata alla documentazione .
entusiasmo il

Grazie per aver sollevato questo argomento! Pacchetto pulito.
codekoala

5
Non è completamente indipendente dalla piattaforma: su OSX puoi incorrere in errori AccessDenied: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos

@amos ha un senso: vorresti avere i privilegi in atto prima di raggiungere le informazioni sui processi. Grazie per il suggerimento.
JSmyth

Per amplificare il punto OSX, sono necessari i privilegi di root su OSX per ottenere informazioni sul processo, a differenza di Linux.
RichVel

8

Puoi utilizzare una libreria di terze parti, come PSI :

PSI è un pacchetto Python che fornisce accesso in tempo reale ai processi e ad altre informazioni di sistema varie come architettura, boottime e filesystem. Ha un'API pitonica che è coerente su tutte le piattaforme supportate, ma espone anche dettagli specifici della piattaforma, ove desiderabile.


2
PSI è stato aggiornato l'ultima volta nel 2009, mentre psutil è stato aggiornato questo mese (novembre 2015) - sembra che psutil sia una scommessa migliore.
RichVel

7

Il modo approvato per creare e utilizzare processi figlio è attraverso il modulo sottoprocesso.

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

Il comando è suddiviso in un elenco di argomenti Python in modo che non debba essere eseguito in una shell (per impostazione predefinita, il subprocess.Popen non utilizza alcun tipo di ambiente shell, ma lo esegue solo). Per questo motivo non possiamo semplicemente fornire 'ps -U 0' a Popen.



-2
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
    print(lst[i])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.