Process.Start()创建的进程在父应用关闭时终止。

3
我将使用C#和Mono 2.10.2在Debian 6上进行操作。
场景如下:我通过Process.Start()方法创建了一个进程,代码如下:
Process p = new Process();

p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.WorkingDirectory = "/home/lucy/";
p.StartInfo.FileName = "/bin/sh";
p.StartInfo.Arguments = "/home/lucy/test.sh";

p.EnableRaisingEvents = true;
p.ErrorDataReceived += new DataReceivedEventHandler(ShellProc_ErrorDataReceived);

p.Start();

在这种情况下称为test.sh的shell脚本被运行,其中包括启动一个java应用程序。我遇到的问题是当c#应用程序终止时,bash脚本/ java应用程序也会终止。
我查看了Stack Overflow上发布的几个类似的问题,但没有明显的结论,包括这个:如何创建一个超越其父进程的进程
根据一些用户和文档,由Process.Start()创建的进程不应在应用程序终止时终止,但在我的情况下显然不是这样。那么这可能是一个Mono相关的问题,如果确实是这种情况,那么是否有任何替代方法来解决目前的问题,因为我已经没有更多的想法了。

这绝对不会发生在Windows上,所以肯定是某些与mono/nix有关的特定问题。 - Andrew Savinykh
请将您的更新发布为新答案,然后将其标记为解决方案。 - Lex Li
2个回答

2

这是一个完整的示例,对我非常有效:

using System;
using System.Diagnostics;

class Tick {
  static void Main(string[] args) {  
    Process p = new Process();

    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
    p.StartInfo.FileName = "/bin/sh";
    p.StartInfo.Arguments = "test.sh";

    p.EnableRaisingEvents = true;
    p.ErrorDataReceived += new DataReceivedEventHandle(ShellProc_ErrorDataReceived);

    p.Start();
    System.Threading.Thread.Sleep (5000);
    Console.WriteLine ("done");
  }  
  static void ShellProc_ErrorDataReceived (object sender, DataReceivedEventArgs ea)
  {
  }
}

然后test.sh是:

while true; do
    date;
    sleep 1;
done

当我从终端运行示例时,test.sh脚本将在示例程序退出后继续输出数据。

1
谢谢,经过测试我意识到问题完全是我自己的错,是应用程序中的另一个区域调用了一些GC相关的东西,导致应用程序创建的进程关闭。你帮助我意识到了我的错误所在,谢谢! - Jazza1

1

更新1/解决方案:实际上这不是mono的问题,而是我的问题。下面的答案帮助我得出结论:应用程序中的其他内容导致应用程序终止时由应用程序启动的进程终止,而实际导致这种情况的是一些GC内容,具体来说是GC.Collect()。这是我的错,很抱歉,希望这能帮助任何遇到类似问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接