Lista de processos no Linux via Python

91

Como posso obter a lista de processos em execução usando Python no Linux?

Madzombie
fonte
1
Você pode usar o módulo de subprocesso: andreinc.net/2010/11/07/…
Andrei Ciobanu

Respostas:

128

IMO olhar para o /procsistema de arquivos é menos desagradável do que hackear a saída de texto dele 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
fonte
10
Você terá que envolver a chamada read () com um bloco try / except, pois um pid retornado da leitura os.listdir ('/ proc') pode não existir mais no momento em que você ler o cmdline.
Yanamon
4
Finalmente! Validação! Agora posso parar! :-)
bobince
5
-1 para / proc, já que não é portátil e há interfaces melhores disponíveis
Boa pessoa,
2
Cuidado: a linha de comando termina em 0x00. Os espaços em branco também são substituídos pelo mesmo caractere.
Federico
2
Basta usar psutil- ele faz tudo isso por meio de uma bela interface Pythonic e é portátil se você quiser executar em um servidor não Linux.
RichVel
83

Você pode usar o psutil como uma solução independente de 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
fonte
2
basta dar uma olhada na documentação .
entusiasmado em
Obrigado por trazer isso à tona! Pacote bacana.
codekoala
5
Não é completamente independente de plataforma - no OSX você pode encontrar erros AccessDenied: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos
@amos meio que faz sentido - você gostaria de ter os privilégios em vigor primeiro, antes de obter informações sobre os processos. Obrigado pela dica.
JSmyth
Para ampliar o ponto OSX - você precisa de privilégios de root no OSX para obter informações do processo, ao contrário do Linux.
RichVel
8

Você pode usar uma biblioteca de terceiros, como PSI :

PSI é um pacote Python que fornece acesso em tempo real a processos e outras informações diversas do sistema, como arquitetura, tempo de inicialização e sistemas de arquivos. Ele tem uma API pythônica que é consistente em todas as plataformas suportadas, mas também expõe detalhes específicos da plataforma quando desejável.

ars
fonte
2
O PSI foi atualizado pela última vez em 2009, enquanto o psutil foi atualizado este mês (novembro de 2015) - parece que o psutil é uma aposta melhor.
RichVel
7

A maneira autorizada de criar e usar processos filhos é por meio do módulo de subprocesso.

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

O comando é dividido em uma lista de argumentos python para que não precise ser executado em um shell (por padrão, o subprocesso. Popen não usa nenhum tipo de ambiente de shell, apenas o executa). Por causa disso, não podemos simplesmente fornecer 'ps -U 0' para Popen.

Matt
fonte
0

Eu usaria o módulo de subprocesso para executar o comando pscom as opções apropriadas. Ao adicionar opções, você pode modificar os processos que vê. Muitos exemplos de subprocesso no SO. Esta pergunta responde como analisar a saída de, pspor exemplo :)

Você também pode, como uma das respostas de exemplo mostradas, usar o módulo PSI para acessar as informações do sistema (como a tabela de processos neste exemplo ).

extrânon
fonte
-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
fonte