2011-07-23 20 views
1

Javaプロセスを実行し続けるために、C#NETで小さなプログラムを書きました。私はそれをたくさんのサーバに配備しようとしており、今はいくつかのコードを修正しています。それが立っているので、私はこのセットアップ権を持っているとは思わない。C#サブプロセスの実行を維持する

私が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); 
    } 
} 
+0

'Exited'イベント' minecraftProcess.Exited + = OnProcessExit; 'を使用することをお勧めします。プロセスが終了したときに通知され、再起動されます。 –

+1

ありがとうございました。これが完璧だったので、ちょうど答えたはずです! –

+0

イベントの発生を確認するには、ProcessのEnableRaisingEventsプロパティをtrueに設定してください... http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.process.exited %28v = vs.110%29.aspx – KabanaSoft

答えて

0

Processクラス自体がシャットダウンから外部プログラムを防ぐカント、あなたは@Jalalのmentionesとして終了しましたイベントを使用したり、プロセスのHasExitedプロパティをポーリングする必要があります。

関連する問題