首页 > 代码库 > 【自己动手】系统服务开关工具

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

     菜鸟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             try24             {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 

netstart OracleService数据库名 

 

--  停止Oracle的服务 

@echooff 

netstop OracleService数据库名 

netstop 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希望这篇文章对您有所帮助。

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