- запустив /usr/bin/time -f "% M" my-server
- запуск внешнего события
- отправка сигнала INT процессу нажатием CTRL + C
- чтение стандартной ошибки
Я попробовал запустить ту же команду, что и подпроцесс, и отправить ему сигнал 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