开发者

C# Keeping Sub-Process Running

开发者 https://www.devze.com 2023-03-22 05:05 出处:网络
I wrote a small program in C# NET a while back to keep a Java process running. I am about to deploy it to a bunch of servers and I am working on fixing up some of the code now. As it stands, I don\'t

I wrote a small program in C# NET a while back to keep a Java process running. I am about to deploy it to a bunch of servers and I am working on fixing up some of the code now. As it stands, I don't think I have this setup right.

What would be the best way to keep the process running that I am creating in my LaunchMinecraft() function? I want to have it so as long as my process is running, it continues to restart this process if it crashes.

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.ErrorD开发者_StackOverflow社区ataReceived += 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);
    }
}


The Process class itself cant prevent your external program from shutting down, you have to use the Exited event as @Jalal mentiones or poll the HasExited property of the process.

0

精彩评论

暂无评论...
验证码 换一张
取 消