c#保持子进程运行

本文关键字:运行 子进程 | 更新日期: 2023-09-27 18:03:07

不久前我用c# . NET写了一个小程序来保持Java进程的运行。我即将把它部署到一堆服务器上,我现在正在修复一些代码。就目前情况来看,我觉得我的设置不对。

保持我在我的LaunchMinecraft()函数中创建的进程运行的最好方法是什么?我想让它,只要我的进程正在运行,它继续重新启动这个进程,如果它崩溃。

static void Main(string[] args)
{
    // Launch the Application
    LaunchMinecraft("minecraft_server.jar", "512");
}
public static void LaunchMinecraft(string file, string memory)
{
    string memParams = "-Xms" + memory + "M" + " -Xmx" + memory + "M ";
    string args = memParams + "-jar " + file + " nogui";
    ProcessStartInfo processInfo = new ProcessStartInfo("java.exe", args);
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    processInfo.RedirectStandardOutput = true;
    processInfo.RedirectStandardInput = true;
    processInfo.RedirectStandardError = true;
    try
    {
        using (Process minecraftProcess = Process.Start(processInfo))
        {
            // Store Process Globally to access elsewhere
            JavaProcess = minecraftProcess;
            // Creates a Repeating Poll Timer (30 Seconds)
            // Use this to keep the Minecraft's Process Affinity/Priority the same as the Daemon
            PollTimer = new System.Timers.Timer();
            PollTimer.Elapsed += new ElapsedEventHandler(Event_PollProcess);
            PollTimer.Interval = 5000;
            PollTimer.Start();
            Console.WriteLine("Minecraft Process Started.");
            // Setup Callback for Redirected Output/Error Streams
            minecraftProcess.OutputDataReceived += new DataReceivedEventHandler(Handler_ProcessOutput);
            minecraftProcess.ErrorDataReceived += new DataReceivedEventHandler(Handler_ProcessError);
            // Steam Writer
            streamWriter = minecraftProcess.StandardInput;
            minecraftProcess.BeginOutputReadLine();
            minecraftProcess.BeginErrorReadLine();
            while (minecraftProcess.HasExited == false)
            {
                String strInput = Console.ReadLine();
                SendProcessCmd(strInput);
            }
            minecraftProcess.WaitForExit();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

c#保持子进程运行

Process类本身不能阻止您的外部程序关闭,您必须像@Jalal提到的那样使用exit事件或轮询进程的HasExited属性。