Python aracılığıyla Linux'ta işlem listesi


Yanıtlar:


128

IMO'nun /procdosya sistemine bakması , metin çıktısını hacklemekten daha az kötüdür 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
Os.listdir ('/ proc') okunmasından dönen bir pid, cmdline'ı okuduğunuzda artık mevcut olmayabileceğinden, read () çağrısını bir try / exclude ile çevrelemeniz gerekecektir.
Yanamon

4
Sonunda! Doğrulama! Şimdi durabilirim! :-)
bobince

5
-1 for / proc taşınabilir olmadığı ve daha iyi arayüzler mevcut olduğu için
Good Person

2
Dikkat edin: komut satırı 0x00 ile sonlandırılır. Beyaz boşluklar da aynı karakterle değiştirilir.
Federico

2
Sadece kullanın psutil- tüm bunları güzel bir Pythonic arayüz aracılığıyla yapar ve Linux olmayan bir sunucuda çalıştırmak isterseniz taşınabilir.
RichVel

83

Psutil'i platformdan bağımsız bir çözüm olarak kullanabilirsiniz !

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
sadece belgelere bir göz atın .
enthus1ast

Bu konuyu açtığın için teşekkürler! Düzgün paket.
codekoala

5
Tamamen platformdan bağımsız değil - OSX'te AccessDenied hatalarıyla karşılaşabilirsiniz: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos

@amos biraz mantıklı - süreçler hakkında bilgiye ulaşmadan önce önceliklere sahip olmak istersiniz. İpucu için teşekkürler.
JSmyth

OSX noktasını büyütmek için - Linux'tan farklı olarak, işlem bilgisi almak için OSX'te kök ayrıcalıklarına ihtiyacınız var.
RichVel

8

PSI gibi bir üçüncü taraf kitaplığı kullanabilirsiniz :

PSI, süreçlere ve mimari, boottime ve dosya sistemleri gibi diğer çeşitli sistem bilgilerine gerçek zamanlı erişim sağlayan bir Python paketidir. Desteklenen tüm platformlarda tutarlı olan ancak aynı zamanda istendiğinde platforma özgü ayrıntıları ortaya çıkaran bir pitonik API'ye sahiptir.


2
PSI en son 2009'da güncellenirken, psutil bu ay güncellendi (Kasım 2015) - psutil daha iyi bir bahis gibi görünüyor.
RichVel

7

Çocuk süreçleri yaratmanın ve kullanmanın onaylanmış yolu, alt süreç modülüdür.

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

Komut, bir kabukta çalıştırılmasına gerek kalmaması için bir python argümanlar listesine bölünmüştür (Varsayılan olarak, alt işlem.Popen herhangi bir kabuk ortamı kullanmaz, sadece çalıştırır). Bu nedenle Popen'e 'ps -U 0' sağlayamıyoruz.


0

Komutu uygun seçeneklerle yürütmek için alt işlem modülünü kullanırdım ps. Seçenekler ekleyerek hangi işlemleri gördüğünüzü değiştirebilirsiniz. SO'da alt süreçle ilgili çok sayıda örnek. Bu sorups , örneğin çıktısının nasıl ayrıştırılacağını yanıtlar :)

Yapabilirsin, olarak gösterdi örnek cevapları biri de kullanmak PSI (örneğin süreç tablo olarak erişim sistemi bilgilere modülü bu örnekte ).


0
from psutil import process_iter
from termcolor import colored

names = []
ids = []

x = 0
z = 0
k = 0
for proc in process_iter():
    name = proc.name()
    y = len(name)
    if y>x:
        x = y
    if y<x:
        k = y
    id = proc.pid
    names.insert(z, name)
    ids.insert(z, id)
    z += 1

print(colored("Process Name", 'yellow'), (x-k-5)*" ", colored("Process Id", 'magenta'))
for b in range(len(names)-1):
    z = x
    print(colored(names[b], 'cyan'),(x-len(names[b]))*" ",colored(ids[b], 'white'))

StackOverflow'a hoş geldiniz. Bu kod soruyu çözebilirken, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , gönderinizin kalitesini artırmaya gerçekten yardımcı olur ve muhtemelen daha fazla oy almanıza neden olur. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın. Açıklamalar eklemek ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge vermek için lütfen yanıtınızı düzenleyin .
Ruli

-2
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
    print(lst[i])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.