我在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相关的问题,如果情况确实如此,那么现在我可以做任何其他选择,因为我没有想法。
答案 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(),我的错,对不起,我希望这可以帮助任何有类似问题的人。