验证另一个应用程序是否始终在运行
本文关键字:运行 是否 另一个 应用程序 验证 | 更新日期: 2023-09-27 18:10:45
我正试图在c#中制作一个控制台应用程序,以确认另一个应用程序始终在运行。另一个应用程序定期崩溃,我需要每隔几分钟检查一次,如果它停止工作,就重新启动它。
有很多关于SO的问题,确保不超过一个应用程序实例正在运行。我正试图确认一个(不多也不少)一直在运行。
有人知道怎么开始接近这个吗?
我建议使用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();
}
这些命令用于控制进程:
// 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();
如果您实现了"不超过一个"规则(正如您指出的那样,这是有充分文档的),然后实现了定期的崩溃检查器,这应该足以确保一个且只有一个副本正在运行。
事实上,周期性进程甚至不需要检查崩溃。它可以只是启动一个实例,如果另一个实例已经在运行,该实例将立即退出,这要归功于您实现的任何"不超过一个"机制。这样做的额外好处是可以避免在检测到死进程和启动新进程之间可能出现的竞争条件。
您有几个选择。第一个是使用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,我们将尝试重新启动它。
我建议您检查您的应用程序是否在运行进程列表中:System.Diagnostics.Process.GetProcesses();