Есть ли способ получить программный вывод ps?

У меня есть веб-сервер, который я сейчас тестирую на использование ЦП. То, что я делаю, по сути, запускаю один процесс для захлопывания сервера запросами, а затем запускаю следующий сценарий bash для определения использования ЦП:

#! /bin/bash

for (( ;; ))
do

    echo "`python -c 'import time; print time.time()'`, `ps -p $1 -o '%cpu' | grep -vi '%CPU'`"
    sleep 5
done

Было бы неплохо иметь возможность сделать это в Python, чтобы я мог запускать его в одном скрипте вместо того, чтобы запускать два. Я не могу найти какой-либо независимый от платформы (или, по крайней мере, независимый от платформы Linux и OS X) способ получить вывод ps в Python без фактического запуска другого процесса для запуска команды. Я могу это сделать, но было бы действительно, если бы для этого был API.

Есть ли способ сделать это или мне придется запускать внешний скрипт?


person Jason Baker    schedule 24.08.2010    source источник
comment
Что не так с запуском подпроцесса? Это то, что делает ваш сценарий оболочки. Каждый раз в цикле он запускает кучу процессов. По крайней мере, 3 отдельных процесса, может быть 4. Что плохого в том, чтобы сократить это число до 1?   -  person S.Lott    schedule 24.08.2010
comment
Я бы сказал, что 5 процессов: один для эха, второй для Python, третий для ps, четвертый для grep и пятый для сна   -  person Xavier Combelle    schedule 24.08.2010
comment
@ S.Lott - это не проблема нежелания запускать слишком много процессов, потому что мне легче рассуждать о коде Python, чем о работе с программами оболочки.   -  person Jason Baker    schedule 24.08.2010
comment
если запуск подпроцессов не имеет значения, то, возможно, вам стоит убрать его из вопроса.   -  person S.Lott    schedule 24.08.2010
comment
Возможный дубликат списка процессов в Linux через Python   -  person 200_success    schedule 22.01.2016
comment
… Хотя другой вопрос специфичен для Linux.   -  person 200_success    schedule 22.01.2016


Ответы (4)


Вы можете проверить этот вопрос о синтаксическом анализе вывода ps с помощью Python. .

Один из ответов предлагает использовать модуль python PSI. Однако это расширение, поэтому я не знаю, насколько оно вам подходит.

Он также показывает в вопросе, как вы можете вызвать подпроцесс ps с помощью python :)

person extraneon    schedule 24.08.2010

Я предпочитаю делать что-то подобное.

collection.sh

for (( ;; ))
do
    date; ps -p $1 -o '%cpu'
done

Затем запустите collection.sh >someFile, пока вы «хлопаете сервер запросами».

Затем завершите эту collection.sh операцию после того, как сервер был захлопнут. В конце у вас будет файл с вашим журналом отметок даты и значений ЦП.

analysis.py

import datetime
with( "someFile", "r" ) as source:
    for line in source:
        if line.strip() == "%CPU": continue
        try:
            date= datetime.datetime.strptime( line, "%a %b %d %H:%M:%S %Z %Y" )
        except ValueError:
            cpu= float(line)
            print date, cpu # or whatever else you want to do with this data.
person S.Lott    schedule 24.08.2010

Вы можете запросить использование ЦП с помощью PySNMP. Это дает дополнительное преимущество, заключающееся в возможности проводить измерения с удаленного компьютера. В этом случае вы можете установить виртуальную машину Zenoss или его родственников и позволить ей выполнять мониторинг за вас.

person Seth    schedule 24.08.2010

Если вы не хотите вызывать PS, то почему бы вам не попробовать с файловой системой / proc. Я думаю, вы можете написать программу на Python и читать файлы из файловой системы / proc и извлекать нужные данные. Я сделал это с помощью perl, написав встроенный код C в скрипт perl. Я думаю, что вы можете найти аналогичный способ и в python. Я думаю, что это выполнимо, но вам нужно пройти через файловую систему / prof и нужно выяснить, что вы хотите и как вы можете возьми. http://www.faqs.org/docs/kernel/x716.html указанный выше URL-адрес может дать некоторый толчок.

person Anil Vishnoi    schedule 26.08.2010
comment
Проблема в том, что это специфично для Linux. Это не будет работать на OS X. - person Jason Baker; 28.08.2010