【问题标题】:C# Stop process started by my own processC#停止由我自己的进程启动的进程
【发布时间】:2020-05-29 02:58:22
【问题描述】:


我为我的 ARK 服务器制作了一个启动器,我可以在其中轻松更改设置并启动。
我用这个启动服务器:

Process serverprocess = new Process();
serverprocess.StartInfo.FileName = Path.GetFileName(serverpath);
serverprocess.StartInfo.Arguments = launch;
serverprocess.StartInfo.UseShellExecute = false;
serverprocess.Start();
serverprocess.WaitForExit();

但是当我按下 CTRL+C 时,它不会等到 ARK 服务器停止,当我的应用程序被杀死时它仍然在后台运行。
我做了一些测试,服务器收到关闭信号并停止(这需要一些时间,尤其是在服务器未完全启动时)。但是,当我的应用程序已经关闭时,服务器仍在运行时需要时间停止。
双击 CTRL+C 会杀死服务器,但由于第一次按下已经将我带出控制台,我无法双击。

知道如何在停止 ARK 服务器的同时阻止我的应用程序关闭吗?
添加Console.TreatControlCAsInput = true; 将阻止服务器甚至接收信号。

谢谢!

【问题讨论】:

  • 我认为依靠 CTRL + C 来安全地关闭程序并不是一个好主意。您应该考虑实施一些措施以正确关闭所有内容。为什么不等用户写“退出”什么的?
  • 好吧,因为您按一次 CTRL+C 停止方舟服务器,按两次将其终止。他们就是这样做到的(Avorion 也使用 CTRL+C 停止服务器)。键入“exit”将要求您打开一个 RCON 连接并将其发送到那里。
  • 只需在你的程序中实现它,当用户输入“exit”时,调用serverprocess.Close();然后等待它退出。 CTRL+C 杀死你的程序,所以你不能正确关闭你的子进程。
  • 不工作,发布在您的答案下。为什么我不能简单地将 CTRL+C 传递给我的子进程?

标签: c# linux .net-core process debian


【解决方案1】:

我的测试没问题

进程 proc = new Process();
proc.StartInfo.FileName = "/bin/bash";//sh
proc.StartInfo.Arguments = "-c \" " + command + " && echo 'OK'\"";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true; proc.Start();

【讨论】:

  • 你在 ARK 服务器上试过吗?它的行为与 bash 脚本不同。按CTRL+C后,方舟服务器仍在后台运行
【解决方案2】:

您应该正确关闭您的程序,以便它正确关闭您的服务器。给你:

var serverProcess = Process.Start(new ProcessStartInfo
{
    FileName = Path.GetFileName(serverpath),
    Arguments = launch,
    UseShellExecute = false
});

while (Console.ReadLine() != "exit")
{
    Thread.Sleep(500);
}

serverProcess.Close();

【讨论】:

  • serverprocess.Close(); serverprocess.WaitForExit(); Console.WriteLine("好的!");会给我一个例外:
  • 未处理的异常。 System.InvalidOperationException:没有进程与此对象关联。在 System.Diagnostics.Process.EnsureState(State state) 在 System.Diagnostics.Process.EnsureState(State state) 在 System.Diagnostics.Process.GetWaitState() 在 System.Diagnostics.Process.WaitForExitCore(Int32 毫秒) 在 System.Diagnostics .Process.WaitForExit() 在 ARKLauncher.Program.Main(String[] args)
  • 哪一行给出了异常?
  • serverprocess.WaitForExit();
  • 哦,是的 serverProcess.Close 已经有 .WaitForExit,只需删除该行我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2017-05-03
相关资源
最近更新 更多