当父应用程序关闭时,Process.Start()创建的进程终止

时间:2011-12-20 00:16:15

标签: c# linux process mono

我在Debian 6上使用C#和Mono 2.10.2。

所以场景是我使用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上发布的其他几个类似的问题,没有一个明显的结论,包括这个:

How to create a Process that outlives its parent

根据一些用户和所谓的文档,Process.Start()创建的进程不应该在应用程序终止时终止,但显然在我的情况下是不正确的。那么这可能是一个与Mono相关的问题,如果情况确实如此,那么现在我可以做任何其他选择,因为我没有想法。

2 个答案:

答案 0 :(得分: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 :(得分:1)

更新1 /解决方案:这实际上不是单声道的错,确实是我自己的错,下面的答案让我得出的结论是,我的应用程序中的其他东西导致了这些过程由应用程序启动,当应用程序终止时终止,导致这个的实际内容是一些GC的东西,特别是GC.Collect(),我的错,对不起,我希望这可以帮助任何有类似问题的人。