Ответ 1
popen
в Unix выполняется с помощью fork
. Это означает, что вы будете в безопасности с:
- вы запускаете
Popen
в родительском процессе - немедленно выйти из родительского процесса
Когда родительский процесс завершается, дочерний процесс наследуется процессом init
(launchd
в OSX) и будет по-прежнему выполняться в фоновом режиме.
Первые две строки вашей программы на Python не нужны, это прекрасно работает:
import subprocess
p = subprocess.Popen(['nc', '-l', '8888'],
cwd="/",
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
Я читал о двойных вилках и не уверен, что это необходимо
Это понадобится, если ваш родительский процесс продолжает работать, и вам нужно защитить своих детей от смерти с родителем. Этот ответ показывает, как это можно сделать.
Как работает двойная вилка:
- создать ребенка с помощью
os.fork()
- в этом дочернем вызове
Popen()
, который запускает длительный процесс - дочерний выход: процесс
Popen
наследуетсяinit
и выполняется в фоновом режиме
Почему родитель должен немедленно выйти? Что произойдет, если он не выйдет сразу?
Если вы оставляете родителя работающим, а пользователь останавливает процесс, например, через ctrl-C
(SIGINT
) или ctrl-\
(SIGQUIT
), тогда он уничтожит как родительский процесс, так и процесс Popen
.
Что если он выходит через секунду после разветвления?
Затем, в течение этого периода 1 с, ваш процесс Popen
уязвим к ctrl-c и т.д. Если вам нужно быть на 100% уверенным, используйте двойное разветвление.