C# 双保险进程监视器(watchdog)(supervisor)-确保被守护的程序永远运行

1,106 阅读1分钟

假设现在有个程序 我希望它一直运行着 几年几十年不去管它。 可是有时候windows总是很梦幻的导致我的程序崩溃退出。所以我决定写一个监视器, 查看当前进程列表 里面如果有这个名字的进程,就sleep一段时间,然后重复监测,如果没有这个进程,则执行这个进程。

但是还有一个问题,假设我的monitor程序也无故崩溃了,那么就没有人监视程序了,所以我又写了一个monitorB,第一个monitor姑且叫monitorA。二者互相监视,一旦任何一个出现崩溃,则运行之。

这有点像流氓软件,或者说auturun病毒。不过没办法,只能这样了。

//MonitorB的代码

 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
            new Thread(CheckAndRunMonitor).Start();
        }

        private static void CheckAndRunMonitor()
        {
            while (true)
            {
                Process[] thisproc = System.Diagnostics.Process.GetProcessesByName("BadaMovie.MonitorA");
                if (thisproc.Length <= 0)
                {
                    Process process = new Process();
                    process.StartInfo.FileName = "BadaMovie.MonitorA.exe";
                    process.StartInfo.WorkingDirectory = ".//";
                    process.Start();
                }
                Thread.Sleep(10000);
            }
        }

       
    }

 


///被监视的进程里面要添加一个按钮///

//这是为了使用户可以方便的结束这几个monitoir,要么手动结束,会很费劲

private void button1_Click(object sender, EventArgs e)
        {
            bool continueFlag = true;
            uint count = 0;
            try
            {
                while (continueFlag && count < 10)
                {
                    continueFlag = false;
                    foreach (Process thisproc in System.Diagnostics.Process.GetProcesses())
                    {
                        if (thisproc.ProcessName == "BadaMovie.MonitorB")
                        {
                            thisproc.Kill();
                            continueFlag = true;
                        }
                        if (thisproc.ProcessName == "BadaMovie.MonitorA")
                        {
                            thisproc.Kill();
                            continueFlag = true;
                        }
                    }
                    count++;
                    Thread.Sleep(500);
                }
            }
            catch (Exception ex)
            {
 
            }
            if (count >= 10)
            {
                MessageBox.Show("关闭Monitor进程尝试超过了10次,均未果");
            }
            else 
            {
                Application.Exit();
            }
        }

//这样,用户可以十分方便的结束任务,而不是一个一个的去进程管理器里面关闭