Список процесів у Linux через Python


Відповіді:


128

ІМО дивиться на /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 / Osim, оскільки pid, повернутий з читання os.listdir ('/ proc'), може не існувати до моменту прочитання cmdline.
Yanamon

4
Нарешті! Перевірка! Тепер я можу зупинитися! :-)
bobince

5
-1 for / proc, оскільки він не є портативним, і доступні кращі інтерфейси
Good Person

2
Слідкуйте: командний рядок завершується на 0x00. Пробіли також замінюються тим же символом.
Федеріко

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
просто подивіться на документацію .
энтузиазм

Дякуємо, що підняли це! Акуратний пакет.
codekoala

5
Це не повністю незалежне від платформи - на OSX ви можете зіткнутися з помилками AccessDenied: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos

@amos має певний сенс - вам спочатку потрібно мати привілеї, перш ніж звертатися до інформації про процеси. Дякую за підказку.
JSmyth

Для посилення точки OSX - вам потрібні root права на OSX, щоб отримувати інформацію про процес, на відміну від Linux.
RichVel

8

Ви можете використовувати сторонні бібліотеки, такі як PSI :

PSI - це пакет Python, який забезпечує доступ у режимі реального часу до процесів та іншої різної системної інформації, такої як архітектура, час завантаження та файлові системи. Він має пітонічний 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, так що її не потрібно запускати в оболонці (за замовчуванням підпроцес. Через це ми не можемо просто поставити "ps -U 0" на Попен.


0

Я б використовував модуль підпроцесу для виконання команди psз відповідними параметрами. Додавши параметри, ви можете змінити, які процеси ви бачите. Безліч прикладів щодо підпроцесу на SO. Це питання відповідає, як проаналізувати вихідні дані, psнаприклад :)

Ви можете, як показав один із прикладів відповідей, також використовувати модуль PSI для доступу до системної інформації (наприклад, таблиці процесів у цьому прикладі ).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.