写一个服务,隔5分钟检测一次,某一个进程,是否启动,如果没有启动,则开启进程

 public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            System.Timers.Timer timer1 = new System.Timers.Timer();  //创建一个定时器
            timer1.Interval = 1000 * 60 * 5;//5min执行一次
            timer1.Elapsed += Timer1_Elapsed;
            timer1.Enabled = true;
            timer1.Start();
            string ope = "启动服务";
            SaveRecord(ope);
            StartServer();
        }

        private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            string ope = "启动服务";
            SaveRecord(ope);
            StartServer();
        }

        private void StartServer()
        {
            Process[] processes = Process.GetProcessesByName("iexplore");  //进程名称

            if (processes == null || processes.Length == 0)
            {
                Process myProcess = new Process();
                try
                {
                    myProcess.StartInfo.UseShellExecute = false;  //是否使用操作系统shell启动进程
                    myProcess.StartInfo.FileName = "C:\\Program Files\\Internet Explorer\\iexplore.exe";  //进程路径
                    myProcess.StartInfo.CreateNoWindow = true;   //是否在新窗口中,启动该进程的值
                    myProcess.Start(); //启动process组件的Process.StartInfo属性的指定进程资源
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }

        private void SaveRecord(string ope)
        {
            using (FileStream fs = new FileStream("E:\\log.txt", FileMode.Append, FileAccess.Write))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                {
                    sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ope);
                }
            }
        }

        protected override void OnStop()
        {
            string ope = "停止服务";
            SaveRecord(ope);
        }
    }

创建写完之后,需要将服务安装到计算机。

安装服务最简单的方法:

1.将c:\\window\microsoft .net\……4.5(3.5,4.0)下面的InstallUtil.exe 与InstallUtilLib.dll复制到服务项目bin\debug目录下

2.新建一个Txt文件,输入InstallUtil (-e) WindowsService1.exe  另存为install.bat,然后双击此文件,即可安装服务。

3.1输入services.msc查看服务,找到刚刚安装的服务,启动就可以了。

3.2或者在cmd下,输入net start 服务名称。如:net start Service1

卸载服务最简单的方法: (卸载之前最好先将服务停止net stop Service1)

1.将c:\\window\microsoft .net\……4.5(3.5,4.0)下面的InstallUtil.exe 与InstallUtilLib.dll复制到服务项目bin\debug目录下

2.新建一个Txt文件,输入InstallUtil -u WindowsService1.exe  另存为uninstall.bat,然后双击此文件,即可卸载服务。

3输入services.msc查看服务,可以看到卸载的服务已经没有了。

安装与卸载服务,也可以写到c#程序中:


写到C#程序中后,直接运行.exe文件就ok了。

class Program
    {
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            string sysDisk = System.Environment.SystemDirectory.Substring(0, 3);
            string dotNetPath = sysDisk + @"Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe"; //.net4.0的环境
            string serviceExePath = Application.StartupPath + @"\WindowsService1.exe";//exe文件的路径,将服务的exe文件放到此项目的bin下

            string serviceInstallCommand = string.Format(@"{0} {1}", dotNetPath, serviceExePath);  //安装服务时使用的dos命令

            string serviceUninstallCommand = string.Format(@"{0} -u {1}", dotNetPath, serviceExePath);//卸载服务时使用的dos命令
            try
            {
                if (File.Exists(dotNetPath))
                {
                    string[] cmd = new string[] { serviceUninstallCommand, "net stop Service1" };
                    string ss = Cmd(cmd);
                    CloseProcess("cmd.exe");
                }
            }
            catch
            { }
            Thread.Sleep(1000);

            try
            {
                if (File.Exists(dotNetPath))
                {
                    string[] cmd = new string[] { serviceInstallCommand };//{serviceInstallCommand,"net start Service1"}  在cmd中直接启动也可以
                    string ss = Cmd(cmd);
                    CloseProcess("cmd.exe");
                }
            }
            catch
            { }

            try
            {
                Thread.Sleep(3000);
                ServiceController sc = new ServiceController("Service1");

                //判断服务的当前状态,如果没有启动,则启动。
                if (sc != null && (sc.Status.Equals(ServiceControllerStatus.Stopped)) || (sc.Status.Equals(ServiceControllerStatus.StopPending)))
                {
                    sc.Start();
                }
                sc.Refresh();
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }

        private static bool CloseProcess(string procName)
        {
            bool result = false;
            System.Collections.ArrayList procList = new System.Collections.ArrayList();
            string tempName = "";
            int begpos;
            int endpos;
            foreach (Process item in Process.GetProcesses())
            {
                tempName = item.ToString();
                begpos = tempName.IndexOf("(") + 1;
                endpos = tempName.IndexOf(")");
                tempName = tempName.Substring(begpos, endpos - begpos);
                procList.Add(tempName);

                if (tempName == procName)
                {
                    if (!item.CloseMainWindow())
                        item.Kill();//当发送关闭窗口命令无效时强行结束进程
                    return true;
                }
            }
            return result;
        }

        private static string Cmd(string[] cmd)
        {
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.AutoFlush = true;
            for (int i = 0; i < cmd.Length; i++)
            {
                p.StandardInput.WriteLine(cmd[i].ToString());
            }
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return strRst;
        }
    }
时间: 2024-08-07 17:00:25

写一个服务,隔5分钟检测一次,某一个进程,是否启动,如果没有启动,则开启进程的相关文章

当日志文件中的时间与主机时间不同步时,怎么监控每隔五分钟检测一次日志文件是否出自按某个关键字?

今有需求:需要监控每隔五分钟检测一次日志文件是否出自按某个关键字.利用过滤全部的日志信息 虽然可以过滤出来关键字告警,但是修复后,依然还是会报警,存在局限性,所以需要使用以下办法来实现需求. 本想循环获取5分钟内的时间戳,然后从日志文件中grep这个时间端的信息,然后再获取关键字,但是通过查看日志文件发现时间戳与主机时间不同步,所以,这种方法不可取.那么怎么获取最近五分钟的日志信息,再过滤关键字呢?思索了很久,又有了新思路.将现在的文件日志重定向到一个新的文件里面 cat /var/log/xx

spring-eureka 源码解读----为什么一个服务最多两分钟被其他服务感知

Eureka的wiki上有一句话,大意是一个服务启动后最长可能需要2分钟时间才能被其它服务感知到,但是文档并没有解释为什么会有这2分钟.其实这是由三处缓存 + 一处延迟造成的. 首先,Eureka对HTTP响应做了缓存.在Eureka的"控制器"类ApplicationResource的109行可以看到有一行 String payLoad = responseCache.get(cacheKey); 1 的调用,该代码所在的getApplication()方法的功能是响应客户端查询某个

zabbix 自定义监控项每隔1分钟检测一次三次失败报警

在agent上添加 UserParameter=auth.check,/etc/zabbix/auth_monitor/auth_check.py auth.check就是之后添加的自定义的item值.脚本返回0/1,做trigger报警用 #!/usr/bin/env python #_*_coding:utf-8_*_ import os,sys,time import smtplib from email.mime.text import MIMEText from email.heade

用python写windows服务

用python写windows服务(1) 以python2.5 为例需要软件 * python 2.5        * pywin32(与2.5 版本相匹配的) Service Control Manager (SCM) 服务管理器(SCM) 是windows NT的 一部分,所有服务必须通过SCM 注册,SCM负责启动,停止服务等. 当一个进程通过SCM注册后, 有如下特质: * 运行该进程的用户,未必是当前登录的用户.        * 该进程如果依赖其他服务,哪么该服务启动前,依赖服务回

angular入门-如何写一个服务

服务的好处暂且不讨论,先写, 1.定义模块 2.利用工厂方法写服务 3.注入到controller 1. 1 <!doctype html> 2 <html ng-app="myApp"> 3 <head> 4 <script src="angular.js"></script> 5 <style type="text/css"> 6 .btn{ 7 width: 60px;

如何写SysV服务管理脚本

本文目录: 1.1 SysV脚本的特性1.2 SysV脚本要具备的能力1.3 start函数分析1.4 stop函数分析1.5 reload函数分析1.6 status.restart.force-reload等1.7 结束语 SysV服务管理脚本和/etc/rc.d/init.d/functions文件中的几个重要函数(包括daemon,killproc,status以及几个和pid有关的函数)"关系匪浅".本人已对该文件做了极详细的分析和说明,参考functions文件详细分析和说

把linux可执行程序做成一个服务

在linux系统启动的时候,我们可以看到很多服务性程序一个接一个的被启动(就是那些后面有一个兰色[OK]的行),这些在后台运行的程序为我们使用计算机起了很重要的作用,以这种方式运行的程序有以下特点: 开机启动.关机停止.后台运行 通过service 命令控制或查看对应的程序的运行状态 恩,不错,那怎么把我们自己编制的程序做成这样的一个服务呢? 废话少说,主要分以下3步:     1.把可执行程序放到一个linux系统可以找到的地方. 在linux命令提示符下输入env ,回车后可看到环境变量,里

c#写windows服务

c#写windows服务 序言 前段时间做一个数据迁移项目,刚开始用B/S架构做的项目,但B/S要寄存在IIs中,而IIs又不稳定因素,如果重启IIs就要打开页面才能运行项目.有不便之处,就改用Windows服务实现.这篇就总结下,windows服务的编写,调试,安装卸载. Windows服务介绍 Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务

Windows下如何卸载一个服务

运行-->cmd-->到c:\windows\system32文件夹下-->输入sc delete <服务名称>,然后就可以把服务卸载了 这时候,我们可以用另外一个命令来卸载,如下: C:\WINDOWS\system32>sc delete MyService 其中的 MyService 是你的服务的名字,比如如下的服务截图,它的卸载命令就可以如下写: sc delete "服务名" 当然你也可以用这个工具create,start,stop服务.比