我在Linux系统上使用Mono来启动进程。偶然地,父进程死于不合时宜的死亡,并带着子进程,但我需要让子进程继续进行。
在测试中,我测试的System.Diagnostics.Process.Start()的每个变体都会导致它的子进程在我杀死父进程时死亡。
是否有一些我缺少的设置,或另一种方法来实现这一目标?
作为测试,这个:
System.Diagnostics.Process.Start(new ProcessStartInfo("journalctl", "-f") {UseShellExecute = true});
此:
System.Diagnostics.Process.Start(new ProcessStartInfo("journalctl", "-f") {UseShellExecute = false});
和本:
System.Diagnostics.Process.Start("journalctl", "-f");
将启动'journalctl'('ps -aef'表示正确的父子ID),当我杀死父进程时,'journalctl'也会死掉。
我应该为子进程启动一个使用nohup和disown的脚本吗?
答案 0 :(得分:0)
完成子进程与父进程的解除关联需要子进程进行多次系统调用;如果MONO无法访问相应的系统调用(fork
首先创建子进程,然后setsid
转义父进程组,处理标准输入,这可能更容易通过shell包装器执行和标准输出文件句柄,可能是chdir
到/
,以及我忘记的任何其他内容。您的MONO调用看起来更类似于system(3)
系统调用,这也需要使用setsid
等的包装器程序。