• 用C#写一个多进程监控自动关机工具


    因为据说某server开着就很贵,所以我们跑完测试的job后就要赶紧关机才行,但是测试的job要跑很久,过程中又不需要干什么,所以就得有个守家的,有时候会走很晚。如果有一个自动化关机的工具就好了,当指定的进程结束了以后系统就会自动关机。这件事我在上一篇中已经做好了。这一次领导又有新需求,说要监控多个进程而不单单是一个了,需要有一个配置文件来配置所需要监控的进程名,而且想要可以自主选择检查的间隔,于是就有了下文。

    代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.Text.RegularExpressions;
    using System.IO;
    
    namespace AutoShutDown2
    {
        public partial class MainForm : Form
        {
            public MainForm()
            {
                InitializeComponent();
            }
    
            private void chooseFileButton_Click(object sender, EventArgs e)
            {
                OpenFileDialog fileName = new OpenFileDialog();
                fileName.Filter = "文本文件|*.*|C#文件|*.cs|所有文件|*.*";
                if (fileName.ShowDialog() == DialogResult.OK)
                {
                    filePath.Text = fileName.FileName;
                }
            }
    
            private void filePath_Click(object sender, EventArgs e)
            {
                filePath.Text = "";
            }
    
            private void startButton_Click(object sender, EventArgs e)
            {
                if (filePath.Text.ToString().Substring(filePath.Text.Length - 3, 3) == "txt")
                {
                    if (Regex.IsMatch(duration.Text, "^([0-9]{1,})$"))
                    {
                        if (int.Parse(duration.Text) >= 10)
                        {
                            MessageBox.Show("PCAS will check with a duration of " + duration.Text + "s.");
                            this.Hide();
                            //Check the processes with the duration.
                            DurationStart();
                        }
                        else 
                        {
                            MessageBox.Show("The integer number should be greater than 10 seconds.");
                        }
                    }
                    else
                    {
                        MessageBox.Show("You can only type in an integer for duration.");
                        duration.Text = "";
                    }
                }
                else 
                {
                    MessageBox.Show("You can only choose a txt to be a configuration file.");
                    filePath.Text = "";
                }
            }
    
            private void DurationStart()
            {
                //Check the process's status with the duration.
                System.Timers.Timer tmr = new System.Timers.Timer(int.Parse(duration.Text)*1000);
                tmr.Elapsed += new System.Timers.ElapsedEventHandler(CheckProcess);
                tmr.AutoReset = true;
                tmr.Enabled = true;
            }
    
            private void CheckProcess(object source, System.Timers.ElapsedEventArgs e)
            {
                //Check the processes's status in the config file.
                FileStream fs = new FileStream(filePath.Text, FileMode.Open);
                StreamReader sr = new StreamReader(fs);
                string line;
                int numOfTheProcesses = 0;
                while ((line = sr.ReadLine()) != null)
                {
                    var processes = System.Diagnostics.Process.GetProcesses();
                    foreach (var process in processes)
                    {
                        if (process.ProcessName == line)
                        {
                            //Find the objective process.
                            //MessageBox.Show(line);
                            numOfTheProcesses++;
                        }
                    }
                }
                if (numOfTheProcesses == 0)
                {
                    //No such process, shut down the computer.
                    //MessageBox.Show("The computer is ready to be shut down.");
                    //Shut down the computer
                    ShutDown();
                }
                sr.Close();
                fs.Close();
            }
    
            private void ShutDown()
            {
                //Shut down the computer.
                System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
                myProcess.StartInfo.FileName = "cmd.exe";
                myProcess.StartInfo.UseShellExecute = false;
                myProcess.StartInfo.RedirectStandardInput = true;
                myProcess.StartInfo.RedirectStandardOutput = true;
                myProcess.StartInfo.RedirectStandardError = true;
                myProcess.StartInfo.CreateNoWindow = true;
                myProcess.Start();
                myProcess.StandardInput.WriteLine("shutdown -s -t 0"); 
            }   
        }
    }

    你需要输入一个大于10的整数,并且填写的路径一定要是一个txt文本。否则会给予提示。

    配置文件中的配置是这样的,每一行填写一个要监控的进程名:

    路径和时间间隔填写正确以后点击Start就会开始按你设定的时间间隔自动监控配置文件中的所有进程,等到所有进程都停止后系统就会自动关机。

  • 相关阅读:
    一个小型软件公司关于研发、管理、实施、团队等讨论
    二十七、EFW框架BS系统开发中的MVC模式探讨
    EFW框架问题收集与答疑
    EFW框架源代码版本升级记录说明
    【开源EFW框架】框架中自定义控件GridBoxCard使用实例说明
    二十七(序幕)、【开源】EFW框架破茧成蝶
    二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件
    二十五、【开源】EFW框架Winform前端开发之强大的自定义控件库
    二十四、【开源】EFW框架Winform前端开发之项目结构说明和调试方法
    二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/4687018.html
Copyright © 2020-2023  润新知