• 【自己动手】系统服务开关工具


         菜鸟D最近的项目采用的是Oracle数据库,众所周知,oracle的系统服务会占用比较多的系统资源,如果pc上大量的服务设置为自动启动,那么开机肯定快不了,而且即使开机也会需要“卡”相当长一段时间。菜鸟D的电脑配置不高,在安装oracle之后,从开机到正常工作差不多需要半个小时(呵呵,这电脑真够烂的)。由于无法忍受着漫长的等待,菜鸟D决定手动启动相关服务,然后天天重复这些动作。不久就烦了,于是找了个偷懒的方法,做了一个启动服务的开关。

          这是一个简单的控制台程序,打开一次服务就开启了,再打开一次服务就关闭了(其实就是实现了一个状态的切换),代码如下:

     1  public class Service
     2     {
     3         public static ServiceController GetControllerByName(string name1, string name2)
     4         {
     5             ServiceController[] scs = ServiceController.GetServices();
     6             foreach (ServiceController sc in scs)
     7             {
     8                 if (sc.DisplayName.Contains(name1) && sc.DisplayName.Contains(name2))
     9                 {
    10                     return sc;
    11                 }
    12             }
    13             return null;
    14         }
    15 
    16         public static ServiceController GetControllerByName(string name)
    17         {
    18             return GetControllerByName(name, string.Empty);
    19         }
    20 
    21         public static string ChangeStatus(ServiceController sc)
    22         {
    23             try
    24             {
    25                 TimeSpan ts = new TimeSpan(0, 0, 30);
    26                 string res = "";
    27                 if (sc.Status == ServiceControllerStatus.Stopped || sc.Status == ServiceControllerStatus.StopPending || sc.Status == ServiceControllerStatus.Paused || sc.Status == ServiceControllerStatus.PausePending)
    28                 {
    29                     sc.Start();
    30                     sc.WaitForStatus(ServiceControllerStatus.Running, ts);
    31                     res = sc.DisplayName + "服务已启动...";
    32                 }
    33                 else if (sc.Status == ServiceControllerStatus.Running || sc.Status == ServiceControllerStatus.StartPending)
    34                 {
    35                     sc.Stop();
    36                     sc.WaitForStatus(ServiceControllerStatus.Stopped, ts);
    37                     res = sc.DisplayName + "服务已关闭...";
    38                 }
    39                 return res;
    40             }
    41             catch (Exception ex)
    42             {
    43                 return ex.Message;
    44             }
    45         }
    46     }
    47 
    48 //客户端代码
    49             ServiceController sc1 = Service.GetControllerByName("OracleServiceORCL");
    50             ServiceController sc2 = Service.GetControllerByName("OracleOraDb11g_home", "TNSListener");
    51 
    52             if (sc1.Status != sc2.Status)
    53             {
    54                 Service.ChangeStatus(sc1);
    55             }
    56             Console.WriteLine(Service.ChangeStatus(sc1));
    57             Console.WriteLine(Service.ChangeStatus(sc2));
    58 
    59             Console.ReadKey();

          接下来,简单说下代码的问题:

          第一,一定要给项目添加一个引用 System. ServiceProcess(不会添加引用的自行脑补,不再赘述),否则有些类型是无法使用的。

          第二,菜鸟D在客户端的逻辑并不完美,所以读者完全可以摒弃这段代码,自己写一个适合自己逻辑的代码。在客户端的代码里服务名叫“OracleServiceORCL ”的服务是由于数据库就叫ORCL(我承认我偷懒了),这个自己改一下就好。服务名被分为两段的“OracleOraDb11g_home”和“ TNSListener”的服务则是由于不知道本机的Oracle数据库服务器端装的是第几次(其实是知道的,自己的打开服务看一下就知道了,,一般来说第一次是home1,第二次是home2),将一个服务的名字分开写,可以对服务进行“模糊”判断。由于这两个服务是应该同开同关的(同关不一定,但是一定要同开,不如你数据库一定没法用),所以对他们的状态加了一个判断。

          第三,关于服务名的获取。菜鸟D将服务名写死了,有的小伙伴不知道应该怎么改。打开电脑的服务管理器,里面显示的名称就是服务名称。(找不到服务管理器怎么办?打开控制面板,然后管理工具,然后服务。找不到控制面板怎么办?自行脑补,真是救不了你了)在找到正确的服务名之后,替换客户端的相应代码就OK了。

         第四,请将这两个服务的启动方式改为手动,如果还是自动的,做这个工具有什么意义啊。(不会修改启动方式?打开服务管理器,选择相应的服务,右键属性,常规,启动方式)

         编译生成就可以用了。

         以上是简单的控制台程序来实现系统服务的开关。下面的是一种更加高效的方法——批处理命令。

         命令的格式:net start / stop服务名称 

         批处理命令的代码如下:

    --开启oracle服务

    @echo off

    net start OracleOraHome1TNSListener 

    net start OracleService数据库名 

     

    --  停止Oracle的服务 

    @echo off 

    net stop OracleService数据库名 

    net stop OracleOraHome1TNSListener 

          注意:这两段代码要分成两个批处理文件来写,原因你懂得(你开了又关了是什么意思,到底还要不要开启这服务)。

          批处理命令怎么写?

          创建一个.txt文件,打开,将批处理命令写(zhan)进去,保存,重命名XXX.bat,系统提示选确定,批处理文件就写好了,双击直接运行。(看着真像病毒啊)

          注意,服务名称的获取和简单控制台的获取方法一样。

          据说还有使用cmd命令的(其实批处理就是cmd命令),都是可以实现我们的目的,只是菜鸟D很菜,cmd不擅长,以免误导。方法不止一种,选择最适合自己的。

          想学批处理的可以看一下:

          http://www.jb51.net/article/14632.htm  

          http://blog.163.com/yyitree@126/blog/static/3769210420069306345755/

          http://www.jb51.net/article/41322.htm

          菜鸟D希望这篇文章对您有所帮助。

  • 相关阅读:
    Python 使用 environs 库来更好地定义环境变量
    五分钟带你了解map、reduce和filter
    部署React前端和Django后端的3种方法
    marshmallow库更优雅的数据转换
    利用 attrs 和 cattrs 两个库实现 Python 面向对象编程
    parse库,更友好的格式化数据提取方案
    python之prettytable模块格式化打印
    使用类型注解让 Python 代码更易读
    jksj算法训练营-第三课01 数组、链表、跳表
    linux安装java步骤
  • 原文地址:https://www.cnblogs.com/cnDqf/p/4118718.html
Copyright © 2020-2023  润新知