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

91

Как я могу получить список запущенных процессов с помощью Python в Linux?

Мадзомби
источник
1
Вы можете использовать модуль подпроцесса: andreinc.net/2010/11/07/…
Андрей Чобану

Ответы:

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 / except, так как pid, возвращенный при чтении os.listdir ('/ proc'), может больше не существовать к тому времени, когда вы прочитаете cmdline.
Yanamon 05
4
В конце концов! Проверка! Теперь я могу остановиться! :-)
bobince
5
-1 для / 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
просто взгляните на документацию .
ent1ast
Спасибо, что подняли этот вопрос! Аккуратная упаковка.
codekoala 06
5
Это не полностью зависит от платформы - на OSX вы можете столкнуться с ошибками AccessDenied: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
амосс
@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, поэтому ее не нужно запускать в оболочке (по умолчанию subprocess.Popen не использует какую-либо среду оболочки, он просто выполняет ее). Из-за этого мы не можем просто передать 'ps -U 0' в Popen.

Мэтт
источник
0

Я бы использовал модуль подпроцесса для выполнения команды psс соответствующими параметрами. Добавляя параметры, вы можете изменить, какие процессы вы видите. Множество примеров подпроцесса на SO. Этот вопрос отвечает, например, как разобрать вывод ps:)

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

посторонний
источник
-2
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
    print(lst[i])
Маниваннан Муругавел
источник