首页 > 代码库 > 【自己动手】系统服务开关工具
【自己动手】系统服务开关工具
菜鸟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希望这篇文章对您有所帮助。
【自己动手】系统服务开关工具