我有一个编译和执行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());}
};
虽然这种方法大部分时间都有效,但是当服务器充满了运行具有无限运行时孤立进程的程序的请求时,就会出现并占用资源。
程序以root身份运行,因此缺少权限的可能性为空。
这是处理暗示在linux机器上运行无响应任务的进程的正确方法吗?
请注意: