我在Debian 6上使用C#和Mono 2.10.2。
所以情况是我创build了一个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上发布的其他几个类似的问题,都没有得出明显的结论,包括:
如何创build一个超过其父母的过程
根据一些用户和所谓的文档,Process.Start()创build的进程不应该在应用程序终止时被终止,但显然在我的情况是不正确的。 所以这可能是一个单声道相关的问题,如果确实是这样的话,那么现在我有什么替代scheme,因为我现在没有想法。
这是一个完整的示例,适用于我:
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的东西,特别是GC.Collect(),我的错,对不起,我希望这可以帮助任何有类似问题的人。