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