ИМО, глядя на /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 terminatedcontinue
Вы должны будете окружить вызов 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 как платформо-независимое решение!
@amos вроде как имеет смысл - вы должны сначала иметь привилегии, прежде чем обращаться к информации о процессах. Спасибо за подсказку.
JSmyth
Чтобы усилить точку зрения OSX - вам нужны права root в OSX для получения информации о процессе, в отличие от Linux.
RichVel
8
Вы можете использовать стороннюю библиотеку, например PSI :
PSI - это пакет Python, обеспечивающий доступ в реальном времени к процессам и другой разной системной информации, такой как архитектура, время загрузки и файловые системы. Он имеет питонический API, который согласован на всех поддерживаемых платформах, но также предоставляет специфические для платформы детали, где это необходимо.
Команда разбита на список аргументов Python, поэтому ее не нужно запускать в оболочке (по умолчанию subprocess.Popen не использует какую-либо среду оболочки, он просто выполняет ее). Из-за этого мы не можем просто передать 'ps -U 0' в Popen.
Я бы использовал модуль подпроцесса для выполнения команды psс соответствующими параметрами. Добавляя параметры, вы можете изменить, какие процессы вы видите. Множество примеров подпроцесса на SO. Этот вопрос отвечает, например, как разобрать вывод ps:)
Ответы:
ИМО, глядя на
/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 :
источник
Разрешенный способ создания и использования дочерних процессов - через модуль подпроцесса.
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])
источник