Как я могу получить список запущенных процессов с помощью Python в Linux?
Ответы:
ИМО, глядя на /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
psutil- все это делается через приятный интерфейс Pythonic и переносимо, если вы когда-нибудь захотите работать на сервере, отличном от Linux.
Вы можете использовать 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]
Вы можете использовать стороннюю библиотеку, например PSI :
PSI - это пакет Python, обеспечивающий доступ в реальном времени к процессам и другой разной системной информации, такой как архитектура, время загрузки и файловые системы. Он имеет питонический API, который согласован на всех поддерживаемых платформах, но также предоставляет специфические для платформы детали, где это необходимо.
Разрешенный способ создания и использования дочерних процессов - через модуль подпроцесса.
import subprocess
pl = subprocess.Popen(['ps', '-U', '0'], stdout=subprocess.PIPE).communicate()[0]
print pl
Команда разбита на список аргументов Python, поэтому ее не нужно запускать в оболочке (по умолчанию subprocess.Popen не использует какую-либо среду оболочки, он просто выполняет ее). Из-за этого мы не можем просто передать 'ps -U 0' в Popen.
Я бы использовал модуль подпроцесса для выполнения команды psс соответствующими параметрами. Добавляя параметры, вы можете изменить, какие процессы вы видите. Множество примеров подпроцесса на SO. Этот вопрос отвечает, например, как разобрать вывод ps:)
Вы можете, как показано в одном из примеров ответов, также использовать модуль PSI для доступа к системной информации (например, к таблице процессов в этом примере ).
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
print(lst[i])