ประมวลผลรายการบน Linux ผ่าน Python


คำตอบ:


128

IMO ที่ดู/procระบบไฟล์นั้นน่ารังเกียจน้อยกว่าการแฮ็กเอาต์พุตข้อความของ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
คุณจะต้องล้อมรอบการโทร read () ด้วย try / except block เนื่องจาก pid ที่ส่งคืนจากการอ่าน os.listdir ('/ proc') อาจไม่มีอยู่อีกต่อไปเมื่อคุณอ่าน cmdline
Yanamon

4
ในที่สุด! ตรวจสอบ! ตอนนี้ฉันหยุดได้แล้ว! :-)
bobince

5
-1 สำหรับ / proc เนื่องจากไม่สามารถพกพาได้และมีอินเทอร์เฟซที่ดีกว่า
Good Person

2
ระวัง: บรรทัดคำสั่งถูกยกเลิกโดย 0x00 ช่องว่างจะถูกแทนที่ด้วยอักขระเดียวกัน
Federico

2
เพียงแค่ใช้psutil- ทำทั้งหมดนี้ผ่านอินเทอร์เฟซ Pythonic ที่ดีและพกพาได้หากคุณต้องการใช้งานบนเซิร์ฟเวอร์ที่ไม่ใช่ Linux
RichVel

83

คุณสามารถใช้psutilเป็นโซลูชันอิสระของแพลตฟอร์ม!

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
เพียงแค่ใช้เวลาดูที่เป็นเอกสาร
enthus1

ขอขอบคุณที่แจ้งเรื่องนี้! แพ็คเกจเรียบร้อย
codekoala

5
มันไม่ได้เป็นอิสระจากแพลตฟอร์มอย่างสมบูรณ์บน OSX คุณสามารถพบข้อผิดพลาด AccessDenied: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos

@amos สมเหตุสมผล - คุณต้องการมีสิทธิพิเศษก่อนที่จะติดต่อข้อมูลเกี่ยวกับกระบวนการ ขอบคุณสำหรับคำใบ้
JSmyth

ในการขยายจุด OSX คุณต้องมีสิทธิ์รูทบน OSX เพื่อรับข้อมูลกระบวนการซึ่งแตกต่างจาก Linux
RichVel

8

คุณสามารถใช้ไลบรารีของบุคคลที่สามเช่นPSI :

PSI เป็นแพ็คเกจ Python ที่ให้การเข้าถึงกระบวนการแบบเรียลไทม์และข้อมูลระบบเบ็ดเตล็ดอื่น ๆ เช่นสถาปัตยกรรมการบูตและระบบไฟล์ มี pythonic API ซึ่งสอดคล้องกันในทุกแพลตฟอร์มที่รองรับ แต่ยังเปิดเผยรายละเอียดเฉพาะแพลตฟอร์มที่ต้องการ


2
PSI ได้รับการอัปเดตครั้งล่าสุดในปี 2009 ในขณะที่ psutil ได้รับการอัปเดตในเดือนนี้ (พ.ย. 2015) - ดูเหมือนว่า psutil จะเป็นทางออกที่ดีกว่า
RichVel

7

วิธีที่ถูกต้องตามทำนองคลองธรรมในการสร้างและใช้กระบวนการย่อยคือผ่านโมดูลกระบวนการย่อย

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

คำสั่งถูกแบ่งออกเป็นรายการ python ของอาร์กิวเมนต์เพื่อที่จะไม่ต้องรันในเชลล์ (โดยค่าเริ่มต้นกระบวนการย่อย Open ไม่ใช้สภาพแวดล้อมเชลล์ใด ๆ ที่มันดำเนินการ) ด้วยเหตุนี้เราจึงไม่สามารถจัดหา 'ps -U 0' ให้กับ Popen ได้


0

ฉันจะใช้โมดูลกระบวนการย่อยเพื่อดำเนินการคำสั่งpsด้วยตัวเลือกที่เหมาะสม คุณสามารถแก้ไขกระบวนการที่คุณเห็นได้โดยการเพิ่มตัวเลือก ตัวอย่างมากมายเกี่ยวกับกระบวนการย่อยใน SO คำถามนี้ตอบวิธีแยกวิเคราะห์ผลลัพธ์ของpsตัวอย่าง :)

คุณสามารถเป็นหนึ่งในตัวอย่างคำตอบที่แสดงให้เห็นว่าใช้โมดูลPSIเพื่อเข้าถึงข้อมูลระบบ (เช่นตารางกระบวนการในตัวอย่างนี้ )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.