在C#中杀死无响应进程的最优雅,最安全的方法是什么?

时间:2015-02-25 12:04:56

标签: c# c++ .net linux

我有一个编译和执行C ++程序的C#程序。有时,如果在运行时期间存在无限循环,则进程进入linux D模式,这意味着它没有响应任何内容,因为它正在等待内部事件(I / O)。

要写入C ++程序,我已相应地重定向了输入和输出流。

if (input.Trim () != "") {
        proc.StandardInput.WriteLine (input);
}
try{
    output = proc.StandardOutput.ReadToEnd ();
}

catch{
    output = "Runtime > 500ms .";
}

计时器检查进程是否持续时间超过500毫秒,如果是,则尝试处理它。否则,kills它。

timer.Elapsed += delegate {
                    try{
                        try{
                            proc.StandardOutput.Close();
                            proc.StandardInput.Close();
                        }catch{}
                        try{
                            proc.Kill();
                            proc.Dispose();
                        }catch{}
                            timer.Enabled = false;
                            Log.Warn("A process took longer than expected. Streams and objects were disposed.");
                        }
                        catch(Exception e){Log.ErrorTrace("Timer " + e.ToString());}

                    };

虽然这种方法大部分时间都有效,但是当服务器充满了运行具有无限运行时孤立进程的程序的请求时,就会出现并占用资源。

top

程序以root身份运行,因此缺少权限的可能性为空。

这是处理暗示在linux机器上运行无响应任务的进程的正确方法吗?

请注意:

  • 请求是通过套接字进行的,因此时间安排至关重要。
  • 通过pid手动终止进程将失败(see D mode

0 个答案:

没有答案