运行 在另一个进程中编程并在 Python 中接收 pid
Run program in another process and receive pid in Python
我想 运行 另一个进程中的一个程序,获取 pid 这个程序和子进程不应该依赖于父进程。请参阅以下 Python 代码:
cmd = 'myPythonProgramm -p param'
pid = subprocess.Popen(cmd, shell = True).pid
但是如果我杀死父进程然后也杀死子进程。
如果我使用:
,则不存在此问题
os.system('nohup myPythonProgramm -p param &')
但在这种情况下,我无法获取子进程 pid。
如何 运行 一个程序在另一个进程中获取 pid 这个程序和子进程不应该依赖父进程?
您运行进入 Unix 进程组管理。特别是,当您在连接到终端时杀死进程组的会话领导者(就像您的脚本一样),该组中的所有进程都会收到 SIGHUP
,默认情况下会导致终止。
一种解决方案是使用 os.setsid()
为 child 建立一个新会话。 In Python 3 subprocess.Popen()
接受一个 start_new_session=True
为你做这件事。对于 Python 2,我们可以使用 preexec_fn
:
得到类似的解决方案
subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)
我想 运行 另一个进程中的一个程序,获取 pid 这个程序和子进程不应该依赖于父进程。请参阅以下 Python 代码:
cmd = 'myPythonProgramm -p param'
pid = subprocess.Popen(cmd, shell = True).pid
但是如果我杀死父进程然后也杀死子进程。
如果我使用:
os.system('nohup myPythonProgramm -p param &')
但在这种情况下,我无法获取子进程 pid。
如何 运行 一个程序在另一个进程中获取 pid 这个程序和子进程不应该依赖父进程?
您运行进入 Unix 进程组管理。特别是,当您在连接到终端时杀死进程组的会话领导者(就像您的脚本一样),该组中的所有进程都会收到 SIGHUP
,默认情况下会导致终止。
一种解决方案是使用 os.setsid()
为 child 建立一个新会话。 In Python 3 subprocess.Popen()
接受一个 start_new_session=True
为你做这件事。对于 Python 2,我们可以使用 preexec_fn
:
subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)