Запустите программу в другом процессе и получите 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)