Запустите программу в другом процессе и получите pid в Python

Я хочу запустить программу в другом процессе, получить pid этой программы, а дочерний процесс не должен зависеть от родителя. См. Следующий код Python:

cmd = 'myPythonProgramm -p param'
pid = subprocess.Popen(cmd, shell = True).pid

Но если я убью родительский процесс, тогда также убейте дочерний процесс.
Эта проблема не существует, если я использую:

os.system('nohup myPythonProgramm -p param &')

Но в этом случае я не могу получить дочерний процесс pid.
Как я могу запустить программу в другом процессе, получить pid этой программы, а дочерний процесс не должен зависеть от родителя?

Ответы

Ответ 1

Вы используете управление группами процессов Unix. В частности, когда вы убиваете лидера сеанса группы процессов, когда он подключен к терминалу (как и ваш script), все процессы в этой группе получают SIGHUP, который по умолчанию вызывает завершение.

Одним из решений является создание нового сеанса для ребенка с использованием os.setsid(). В Python 3 subprocess.Popen() принимает start_new_session=True, который делает это для вас. Для Python 2 мы можем получить аналогичное решение, используя preexec_fn:

subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)