Оставьте процесс запущенным после закрытия Python - PullRequest
0 голосов
/ 28 мая 2018

Я хочу оставить процесс запущенным после завершения исходного процесса.

Следующий код не будет поддерживать выполнение этого процесса после уничтожения оригинала.

args = ['yes']
Popen(args, shell=True, stdout=None, stdin=None, stderror=None)

У меня естьперепробовал все, что мог придумать, я использовал варианты os.spawn () и не смог заставить их оставаться открытыми.

Кажется, что посылается прерывание клавиатуры дочернему процессу (команда yes).

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Проблема в том, что, хотя ваш подпроцесс не имеет доступа к консоли через стандартные потоки, он все равно будет иметь управляющий терминал ;процесс может получать сигналы, такие как TSTP (остановка, ^ Z) и INT (^ C), от своего управляющего терминала.Поэтому вам нужно отсоединить процесс от управляющего терминала и всего сеанса.Когда вы сделаете это, у вас будет правильный процесс демона.

В мире C и в Python 2 вы можете добиться этого, вызвав setsid в child процесс, который создаст новый сеанс для дочернего процесса.Кроме того, новый сеанс не будет иметь управляющего терминала.

В Python 3.2+ это еще проще - просто введите start_new_session=True в Popen:

Если start_new_session истинно, setsid() системный вызов будет сделан в дочернем процессе до выполнения подпроцесса.(Только POSIX)

Изменено в версии 3.2: добавлено start_new_session.

0 голосов
/ 29 мая 2018

Если работа с многопроцессорным интерфейсом кажется слишком сложной, в большинстве дистрибутивов Linux есть приложение под названием «screen», которое вы можете вызвать с помощью командной строки, и оно останется активным.Он полнофункциональный и с ним легко взаимодействовать.

это называется примерно так.

#!/usr/bin/python
import subprocess
subprocess.call(["screen", "-S", "session_name", "-X", "stuff", "'command here'`echo -ne '\015'`"])

пожалуйста, не забудьте проверить справочную страницу , чтобы узнать, что делает каждая опция и все доступные функции.

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

screen -d -r -S "session_name"

Когда вы готовы отключиться от процесса экрана и оставить его активным, вы вводите следующую последовательность клавиш в командной строке.

Ctl-a Ctl-d

также запомните команду для перечисления всех доступных команд

Ctl-a ?

Если за пределами экрана вы хотите увидеть все доступные экземпляры, используйте команду

screen -l

исходная ссылка от здесь

0 голосов
/ 28 мая 2018

Попробуйте отключить команду, которая закрывает терминал.

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