вложенный подпроцесс не останавливается - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 3 файла:

sleeper.py

import subprocess

print('start sleeper')
subprocess.run(['sleep', '10'])
print('end sleeper')

waker.py

import subprocess

print('The waker begins')
try:
    subprocess.run(['python3', 'sleeper.py'], timeout=5)
except subprocess.TimeoutExpired:
    pass
print('The waker ends')

awake.py

import subprocess

print('Awake begin')
try:
    subprocess.run(['python3', 'waker.py'], timeout=2.5)
except subprocess.TimeoutExpired:
    pass
print('Awake end')

и я запускаю python3 awake.py.

, но получаю следующий вывод:

Awake begin
The waker begins
start sleeper
Awake end
end sleeper

фактически большеТочно, я сразу получаю первые 3 строки принтера, затем через 2,5 секунды печатается 4-я строка, и я получаю приглашение bash, затем через 7,5 секунд в моей подсказке bash появляется end sleeper.

как мне сделать такуничтожение подпроцесса через тайм-аут также убивает подпроцессы, запущенные этим подпроцессом?

1 Ответ

0 голосов
/ 24 октября 2018

run должен завершить дочерний процесс по истечении времени ожидания.Это прекращает детей также?в твоем случае это не так.Обходной путь может заключаться в использовании Popen, опросе тайм-аута и уничтожении процесса и потомков.

Кажется, что вы не можете использовать его обоими способами: используйте run и убедитесь, что все подпроцессы завершены (когдавы получаете TimeoutException процесс уже убит, поэтому вы теряете следы детей)

proc = subprocess.Popen(args, stderr=errFile, stdout=outFile, universal_newlines=False)
wait_remaining_sec = 2.5

while proc.poll() is None and wait_remaining_sec > 0:
    time.sleep(0.5)
    wait_remaining_sec -= 0.5

if proc.poll() is None:
   # process is still there: terminate it and subprocesses:
   import psutil

   parent_pid = proc.pid  # we get the process pid
   parent = psutil.Process(parent_pid)
   for child in parent.children(recursive=True):
      child.kill()
   parent.kill()

Цикл опроса лучше, чем простой вызов time.sleep(2.5), потому что, если процесс завершается до истечения времени ожидания, вы нехочу подождать 2,5 секунды.Это не вызывает задержку более 0,5 с, если процесс заканчивается раньше.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...