0

我想为我的服务器创建一个自动重启器。我添加了一个复选框并进行了所有必需的检查,但我不知道如何在崩溃时重新启动该进程。

这是我的代码:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    string world = textBox1.Text;
    string auth = textBox2.Text;

    if (checkBox1.Checked == true)
    {
        if (textBox1.Text.Trim().Length == 0 || textBox2.Text.Trim().Length == 0)
        {
            MessageBox.Show("Please check if you selected the path for worldserver and authserver");
        }
        else
        {
            //here i need something to restart those 2 processes after crash/close
        }
    }   
}
4

2 回答 2

0

启动进程最简单的方法是使用类的Start静态方法Process

Process.Start("yourapp.exe");

要访问更具体的选项,您可以设置一个ProcessStartInfo对象:

var startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "yourapp.exe";
startInfo.Arguments = "-arg1 val1";

var exeProcess = Process.Start(startInfo);
exeProcess.Start();

要检查有问题的进程是否仍在运行,您可以使用以下命令:

var matchingProcesses = Process.GetProcessesByName("yourapp");
var isRunning = matchingProcesses.Length > 0;

你可以把它放在一个方法中,每隔几秒或几毫秒轮询一次(取决于你想要多快的响应速度):

var aTimer = new Timer();
aTimer.Elapsed += new ElapsedEventHandler(YourMethod);
aTimer.Interval = 1000;
aTimer.Enabled = true;

这些类分别位于System.DiagnosticsSystem.Timers命名空间中。

于 2013-10-26T17:34:19.023 回答
0

虽然它不是 C#(但更好,它几乎适用于任何程序),但您可以批量执行自动重启程序(或在 bash 中,但我不会将代码放在这里),这对于大多数情况来说已经足够了:

@echo off
:start
myprogram.exe %*
if exist myprogam.lock goto start

在你的程序里面:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
  if(checkBox1.Checked)
  {
     using (System.IO.File.Create("myprogam.lock"));
  }
  else
  {
     System.IO.File.Delete("myprogam.lock")
  }
}

您还应该在主代码或初始化代码中创建该文件。

奖励:如果您的程序完全退出(或某些错误),您可以删除该文件,并且它不会重新启动。

要使用,只需将第一个代码放入您放入程序文件夹的 .bat 文件中,然后使用它来启动程序。

于 2016-12-07T14:08:18.240 回答