我已经阅读了关于子进程和os.fork()的大部分相关问题,包括有关双重fork技巧的所有讨论。然而,这些解决方案似乎都不适用于我的情况。
我想要fork一个新进程,并允许父进程正常终止,而不会破坏子进程的标准输入、标准输出和标准错误,并且不会杀死子进程。
我的第一次尝试是使用subprocess.Popen()
。
#!/usr/bin/python
from subprocess import call,Popen
Popen("/bin/bash", shell=True)
call("echo Hello > /tmp/FooBar", shell=True)
这里的问题是当父进程退出时,子进程也会被终止。我知道有
creationflags
,但它只适用于Windows系统,而我正在使用Linux。如果我们在父进程末尾添加一个无限循环来保持父进程存活,则上述代码可以完美运行。然而,这并不理想,因为父进程已经完成了其工作,没有什么实际原因让它继续存在。
第二次尝试是使用
os.fork()
。#!/usr/bin/python
from subprocess import call
from os import fork
try:
pid = fork()
if pid > 0:
pass
else: # child process will start interactive process
call("/bin/bash", shell=True)
except:
print "Forking failed!"
call("echo Hello > /tmp/FooBar", shell=True)
在这里,子进程不再随父进程死亡,但在父进程死亡后,子进程将无法再读取输入和写入输出。
因此,我想知道如何完全独立地fork一个新进程,其中包括 stdout
、stderr
和 stdin
。独立性意味着父进程可以(正常)终止,而子进程(无论是 bash 还是 tmux 或任何其他交互式程序)表现得就像父程序尚未终止一样。更准确地说,考虑以下原始程序的变体。
#!/usr/bin/python
from subprocess import call,Popen
Popen("/bin/bash", shell=True)
call("echo Hello > /tmp/FooBar", shell=True)
while True:
pass
上述代码具备我所需的所有功能,但却会人为地让Python进程保持活动状态。我正试图实现这种行为,而不让Python进程保持活动状态。 注意:我是通过ssh运行这些应用程序,因此产生一个新的GUI窗口不可行。 期望的行为:
- 运行Python代码。
- 获得一个全新的
bash
shell,其工作方式与我最初启动的bash shell完全相同。 - 创建文件
/tmp/FooBar
。 - 原始Python脚本完成。
- 继续使用我的全新的bash shell,而
ps aux | grep python
的输出不包括我刚刚运行的Python脚本。
tmux
是一个复杂的例子。如果你需要tmux
,请询问你遇到的具体问题。nohup
、disown
或创建一个适当的守护进程?tmux
而变得比必要的复杂,那么这是完全合理的批评。当我回到电脑时,我会编辑问题。我最初使用这个特定的MWE是因为它恰好是我试图解决的问题,而不是因为我认为这个问题不是普遍存在的。 - merlin2011