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 terminatedcontinue
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!
@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.
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.
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 :)
Jawaban:
IMO melihat
/proc
filesystem tidak semanis meretas output teksps
.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
sumber
psutil
- ia melakukan semua ini melalui antarmuka Pythonic yang bagus dan portabel jika Anda ingin menjalankannya di server non-Linux.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]
sumber
Anda dapat menggunakan perpustakaan pihak ketiga, seperti PSI :
sumber
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.
sumber
Saya akan menggunakan modul subproses untuk menjalankan perintah
ps
dengan opsi yang sesuai. Dengan menambahkan opsi, Anda dapat mengubah proses mana yang Anda lihat. Banyak contoh subproses di SO. Pertanyaan ini menjawab bagaimana mengurai outputps
misalnya :)Anda dapat, sebagai salah satu contoh jawaban yang ditunjukkan juga menggunakan modul PSI untuk mengakses informasi sistem (seperti tabel proses dalam contoh ini ).
sumber
import os lst = os.popen('sudo netstat -tulpn').read() lst = lst.split('\n') for i in range(2,len(lst)): print(lst[i])
sumber