Python: сохранить дочерний процесс после уничтожения родительского процесса - PullRequest
0 голосов
/ 18 февраля 2020

Я работаю над простым flask приложением, и у меня есть конечная точка, которая создает сеанс bash по запросу. Я хочу, чтобы процесс был сохранен, даже если я убил flask.

Процесс запущен с использованием subprocess.Popen(), и я хочу, чтобы он продолжался даже после выполнения killall python с терминала.

Я попытался установить аргумент preexec_fn=os.setsid и preexec_fn=setpgrp на Popen, но запуск killall все еще убивает оболочку bash, которую я создал в своем приложении Flask.

Соответствующий код:

def run_command(command):
        Process.proc = subprocess.Popen(
            command,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True,
            preexec_fn=os.setsid,
        )

run_command(['bash', '-c', 'for((i=0;i<1000;i++)); do echo $i; sleep 1; done; echo EOF'])

Буду признателен за любые указатели. Спасибо.

1 Ответ

0 голосов
/ 18 февраля 2020

Вместо непосредственного использования Popen вы можете использовать subprocess.run (), который рекомендуется в документации (17.5.1).

# Python3.5 or above:
from subprocess import PIPE, run

def run_command(cmd:str):
    run(cmd, universal_newlines=True)

def run_piped_command(cmd:str):
    result = run(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
    return result.stdout, result.stderr

Если вы не передаете вывод, как указано @metatoaster, процесс продолжит выполнение, и если вы запустите команду killall python, она выдаст приятное сообщение python: no process found.

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