Как измерить максимальное использование памяти серверным процессом от запуска до SIGINT, используя /usr/bin/time в PythoPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как измерить максимальное использование памяти серверным процессом от запуска до SIGINT, используя /usr/bin/time в Pytho

Сообщение Anonymous »

У меня есть серверная программа (назовем ее my-server), которую я не могу изменить, и мне интересно измерить максимальное использование ею памяти с момента ее запуска до момента возникновения определенного внешнего события.Я могу сделать это вручную в своей оболочке:
  • запустив /usr/bin/time -f "% M" my-server
  • запуск внешнего события
  • отправка сигнала INT процессу нажатием CTRL + C
  • чтение стандартной ошибки
Я хотел бы сделать это программно с помощью Python. Если это невозможно, я бы хотел найти альтернативный простой способ добиться того же результата.
Я попробовал запустить ту же команду, что и подпроцесс, и отправить ему сигнал INT. :
import signal
import subprocess

proc = subprocess.Popen(
["/usr/bin/time", "-f", "%M", "my-server"],
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
text=True
)
# ...wait for external event
proc.send_signal(signal.SIGINT)
out, err = proc.communicate() # both out and err are ""

однако оба параметра out и err пусты.
Тот же сценарий отлично работает для процессов, которые завершаются:
p>
proc = subprocess.Popen(
["/usr/bin/time", "-f", "%M", "echo", "hello"],
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
text=True
)
out, err = proc.communicate() # out is "hello", err is "1920"

но для процессов, которые необходимо завершить с помощью сигнала, я не знаю, как получить stderr после завершения. (или даже раньше, несмотря на бесполезность)
Следующий эквивалентный пример может быть полезен для тестирования:
terminate-me.py
import signal
import sys

def signal_handler(sig, frame):
print('Terminated', file=sys.stderr) # Need to read this
sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
print('Send SIGINT to terminate')
signal.pause()

main.py
import signal
import subprocess

proc = subprocess.Popen(
["python", "terminate-me.py"],
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
text=True
)
# No need to wait for any external event
proc.send_signal(signal.SIGINT)
out, err = proc.communicate()
print(out)
print(err)


Подробнее здесь: https://stackoverflow.com/questions/791 ... gint-using
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»