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

简介: 因为据说某server开着就很贵,所以我们跑完测试的job后就要赶紧关机才行,但是测试的job要跑很久,过程中又不需要干什么,所以就得有个守家的,有时候会走很晚。如果有一个自动化关机的工具就好了,当指定的进程结束了以后系统就会自动关机。

因为据说某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就会开始按你设定的时间间隔自动监控配置文件中的所有进程,等到所有进程都停止后系统就会自动关机。

相关文章
|
22天前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
|
2月前
|
IDE C# 开发工具
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
一个开源轻量级的C#代码格式化工具(支持VS和VS Code)
108 6
|
2月前
|
缓存 监控 调度
第六十一章 使用 ^PERFSAMPLE 监控进程 - 分析维度
第六十一章 使用 ^PERFSAMPLE 监控进程 - 分析维度
27 0
|
14天前
|
C#
C#进程调用FFmpeg操作音视频
因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并、音频合并、音频与视频合并成视频这几个简单的音视频操作。
|
1月前
|
算法 C#
C#开源实用的工具类库,集成超过1000多种扩展方法
C#开源实用的工具类库,集成超过1000多种扩展方法
|
2月前
|
运维 监控 Ubuntu
Python实现ubuntu系统进程内存监控
Python实现ubuntu系统进程内存监控
34 1
|
2月前
|
监控
第六十章 使用 ^PERFSAMPLE 监控进程 - 预定义分析示例
第六十章 使用 ^PERFSAMPLE 监控进程 - 预定义分析示例
22 0
|
2月前
|
监控 Go
第五十九章 使用 ^PERFSAMPLE 监控进程 - 收集样本
第五十九章 使用 ^PERFSAMPLE 监控进程 - 收集样本
24 0
|
2月前
|
监控 Linux
linux监控指定进程
请注意,以上步骤提供了一种基本的方式来监控指定进程。根据你的需求,你可以选择使用不同的工具和参数来获取更详细的进程信息。
28 0