我有一个服务器程序(让我们称之为
my-server
)我无法更改,我有兴趣测量它从启动到某个外部事件发生时的最大内存使用量。
我可以通过以下方式在我的 shell 上手动执行此操作:
跑步
/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
都是空的。
相同的脚本适用于终止的进程:
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)
如果我获取您的两个示例片段并修改
main.py
并从 outside发送
INT
我会得到输出...?
cat main.py
#!/usr/bin/env python3
import signal
import subprocess
proc = subprocess.Popen(
["/usr/bin/time","-f","%M","python", "terminate-me.py"],
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
text=True
)
out, err = proc.communicate()
print(out)
print(err)
cat 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()
在第二个终端中,我找到进程 PID 和
kill -INT PID
并得到:
python main.py
Send SIGINT to terminate
Terminated
9732