Возможно, проблема в том, что ваш подпроцесс создал дочерний процесс для выполнения команды ".sh".Один из способов исправить это - подождать и все дочерние процессы.Например,
import psutil
def run_shell_script(summary_message):
cmd = './process_mlbox_job.sh' + ' ' + summary_message + ' &'
p = subprocess.Popen([cmd], shell=True)
parent = psutil.Process(p.pid)
[child.wait() for child in parent.children(recursive=True)]
(output, err) = p.communicate()
# wait_to_finish(p)
p_status = p.wait()
#def wait_to_finish(p):
# parent = psutil.Process(p.pid)
# children = parent.children()
# for child in children:
# wait_to_finish(child)
# child.wait()
# p.wait()
Однако это может быть связано с условиями гонки, если процесс p умирает слишком быстро.
Если это не проблема, есть другой способуправлять процессом run_shell_script и процессом обратного вызова.Вы можете отслеживать активные подпроцессы с помощью глобального списка и запускать новый подпроцесс только тогда, когда этот список пуст.Например,
messages_to_run = []
active_processes = []
def run_shell_script():
if not messages_to_run: # indicating no messages to run
return
if active_processes:
if active_processes[0].poll() is None: # indicating last process is still running
return
active_process.pop(0)
summary_message = messages_to_run.pop(0)
cmd = './process_mlbox_job.sh' + ' ' + summary_message + ' &'
p = subprocess.Popen([cmd], shell=True)
active_processes.append(p)
(output, err) = p.communicate()
p_status = p.wait()
Отдельно вам нужен бесконечный цикл, который продолжает вызывать «run_shell_script» и добавлять любые новые сообщения в «messages_to_run»