Daftar proses di Linux melalui Python

91

Bagaimana saya bisa menjalankan daftar proses menggunakan Python di Linux?

Madzombie
sumber
1
Anda dapat menggunakan modul subproses: andreinc.net/2010/11/07/…
Andrei Ciobanu

Jawaban:

128

IMO melihat /procfilesystem tidak semanis meretas output teks 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
sumber
10
Anda harus mengelilingi panggilan read () dengan blok coba / kecuali karena pid yang dikembalikan dari membaca os.listdir ('/ proc') mungkin sudah tidak ada lagi pada saat Anda membaca cmdline.
Yanamon
4
Akhirnya! Validasi! Sekarang saya bisa berhenti! :-)
sejak
5
-1 untuk / proc karena tidak portabel dan tersedia antarmuka yang lebih baik
Good Person
2
Hati-hati: baris perintah diakhiri oleh 0x00. Spasi putih juga diganti dengan karakter yang sama.
Federico
2
Cukup gunakan psutil- ia melakukan semua ini melalui antarmuka Pythonic yang bagus dan portabel jika Anda ingin menjalankannya di server non-Linux.
RichVel
83

Anda dapat menggunakan psutil sebagai solusi independen platform!

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]
enthus1ast
sumber
2
lihat saja dokumentasinya .
antusias 1
Terima kasih telah mengungkit hal ini! Paket rapi.
codekoala
5
Ini tidak sepenuhnya independen platform - di OSX Anda dapat mengalami kesalahan AccessDenied: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos
@amos agak masuk akal - Anda ingin memiliki hak istimewa terlebih dahulu sebelum menjangkau informasi tentang proses. Terima kasih atas petunjuknya.
JSmyth
Untuk memperkuat titik OSX - Anda memerlukan hak akses root pada OSX untuk mendapatkan info proses, tidak seperti Linux.
RichVel
8

Anda dapat menggunakan perpustakaan pihak ketiga, seperti PSI :

PSI adalah paket Python yang menyediakan akses waktu nyata ke proses dan informasi sistem lain-lain seperti arsitektur, waktu boot, dan sistem file. Ini memiliki API pythonic yang konsisten di semua platform yang didukung tetapi juga mengekspos detail spesifik platform jika diinginkan.

ars
sumber
2
PSI terakhir diperbarui pada 2009, sedangkan psutil diperbarui bulan ini (Nov 2015) - sepertinya psutil adalah taruhan yang lebih baik.
RichVel
7

Cara yang disetujui untuk membuat dan menggunakan proses anak adalah melalui modul subproses.

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

Perintah dipecah menjadi daftar argumen python sehingga tidak perlu dijalankan di shell (Secara default subprocess.Popen tidak menggunakan jenis lingkungan shell apa pun itu hanya mengeksekusinya). Karena itu kami tidak bisa menyediakan 'ps -U 0' ke Popen.

Matt
sumber
0

Saya akan menggunakan modul subproses untuk menjalankan perintah psdengan opsi yang sesuai. Dengan menambahkan opsi, Anda dapat mengubah proses mana yang Anda lihat. Banyak contoh subproses di SO. Pertanyaan ini menjawab bagaimana mengurai output psmisalnya :)

Anda dapat, sebagai salah satu contoh jawaban yang ditunjukkan juga menggunakan modul PSI untuk mengakses informasi sistem (seperti tabel proses dalam contoh ini ).

extraneon
sumber
-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
sumber