c#-由Process.Start()创建的进程在父应用程序关闭时终止

我在Debian 6上使用C#和Mono 2.10.2.因此,场景是我使用Process.Start()创建了一个如下流程:Process p = new Process();p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardOutput = true;p.Start...

我在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应用程序也终止了.

我查看了此处在堆栈溢出上发布的其他几个类似问题,没有一个得出明显的结论,包括以下内容:

How to create a Process that outlives its parent

根据某些用户以及据推测的文档,由Process.Start()创建的进程不应在应用程序终止时终止,但显然在我看来,这是不正确的.因此,这可能是与Mono有关的问题,如果确实如此,那么由于我的想法不足,是否还有其他选择可以替代我现在的做法.

解决方法:

这是一个对我有用的完整示例:

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脚本将继续输出数据.

本文标题为:c#-由Process.Start()创建的进程在父应用程序关闭时终止

基础教程推荐