我正在尝试在c#中创建一个控制台应用程序,它将确认另一个应用程序始终在运行。另一个应用程序会定期崩溃,我需要每隔几分钟检查一次,如果它已停止工作则重新启动它。
在SO上有很多问题可以解决,而不是只运行一个应用程序实例。我试图确认一个(不多或少)一直在运行。
有人知道如何开始接近这个吗?
答案 0 :(得分:7)
我建议使用System.Diagnostics.Process.GetProcessesByName
查看您的流程是否正在运行,如果没有,请使用System.Diagnostics.Process.Start
启动流程。
var processes = Process.GetProcessesByName("yourProcessName");
if(processes.Length == 0)
{
Process.Start(@"C:\Path\To\Your\Process.exe");
}
// Kill the extras
for(int i = 1; i < process.Length; i++)
{
processes[i].Kill();
}
答案 1 :(得分:3)
这些命令对控制进程非常有用:
// check for processes
Process[] processes = Process.GetProcessesByName("nameOfExecutable");
foreach (Process proc in processes)
{
// do stuff
}
// start process (need path)
Process.Start("pathToExecutable");
// close gui process gently (if needed)
bool status = proc.CloseMainWindow();
// wait for process to close gently
bool status = proc.WaitForExit(killTimeMS);
// force close (kill) process
proc.Kill();
答案 2 :(得分:1)
如果您实施“不超过一个”规则(正如您所指出的那样有详细记录)然后实现定期崩溃检查程序,那么这应该足以确保只运行一个副本。
事实上,定期过程甚至不必检查崩溃。它可以启动一个实例,如果另一个实例已在运行,它将立即退出,这要归功于你实现的“不超过一个”机制。这样做的另一个好处是可以避免在检测死流程和启动新流程之间存在可能的竞争条件。
答案 3 :(得分:0)
您有几个选择。第一个是使用Process类检查正在运行的进程。我从微软网站获得了这个,但它看起来很有效:
public bool IsProcessRunning(string name)
{
//here we're going to get a list of all running processes on
//the computer
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.StartsWith(name))
{
//process found so it's running so return true
return true;
}
}
//process not found, return false
return false;
}
您还可以使用进程间通信。这是我们在内部做的事情。我们有一个观察程序应用程序,它向正在监视的服务发送消息。如果服务在超时期限内没有返回ACK,我们会尝试重新启动它。
答案 4 :(得分:0)
我建议您检查您的应用程序是否在正在运行的进程列表中:
System.Diagnostics.Process.GetProcesses();