Windows下sc create命令行注册服务
如何将VS下Windows服务项目生成的exe注册为windows服务,让其直接从后台运行
方法一:使用windows自带的命令sc,首先我们要用管理员运行cmd
注册服务:
sc create TestService binpath= "D:\Test\Test.WindowsService.exe" start= auto displayname= "Windows测试服务"
注意:所有的等号和值之间需要一个空格(等号前不要空格,等号后要一个空格) !!
——binpath和等号之间不要空格,等号和安装路径(例如"= D:\Test\Test.WindowsService.exe")之间要空格
binpath:你的应用程序所在的路径。
displayname:服务显示的名称。
description:服务描述说明。
如何判断服务是否注册成功:
在cmd中输入services.msc
打开系统服务,查看是否出现“Windows测试服务”(即displayname=
后面的参数,我这里设置的是“Windows测试服务”)
修改描述:
sc description TestService "这是一个Windows测试服务。"
启动服务:
net start TestService
停止服务:
net stop TestService
删除服务:
sc delete TestService
SC命令的更多用法请在查看help sc
使用时我们一般用个文本文档写入命令然后保存成bat格式的文件,添加服务一个,删除服务一个。
例如 “添加服务.bat” 或 Install.bat 内容如下:
@echo off echo 正在安装服务请稍等... set curdir=%~dp0 cd /d %curdir% sc create TestService binpath= "D:\Test\Test.WindowsService.exe" start= auto displayname= "Windows测试服务" sc description TestService "Windows测试服务,不要删除" echo ----------------------------- echo 服务安装成功 echo ----------------------------- echo 正在启动服务请稍等... net start TestService echo ----------------------------- echo 服务启动成功 echo ----------------------------- pause
“删除服务.bat” 或 unInstall.bat 内容如下:
@echo off echo 正在停止服务请稍等... net stop TestService echo ----------------------------- echo 服务停止成功 echo ----------------------------- echo 正在卸载服务请稍等... set curdir=%~dp0 cd /d %curdir% sc delete TestService echo ----------------------------- echo 服务卸载成功 echo ----------------------------- pause
方法二:在Windows服务项目中引入(Topshelf是一个开源的跨平台的宿主服务框架),并且在Program.cs 和 App.config 中做如下配置:
Program.cs
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using Topshelf; using Test.WindowsService.BusService; namespace Test.WindowsService { /// <summary> /// Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono /// </summary> public static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> public static void Main() { //ServiceBase[] ServicesToRun; //ServicesToRun = new ServiceBase[] //{ // new Service1() //}; //ServiceBase.Run(ServicesToRun); try { var serviceName = System.Configuration.ConfigurationManager.AppSettings["ServiceName"]; var displayName = System.Configuration.ConfigurationManager.AppSettings["DisplayName"]; var description = System.Configuration.ConfigurationManager.AppSettings["Description"]; //方式一加载配置文件(配置文件和exe执行文件放在同一目录,配置文件属性设置成始终复制) //string assemblyFilePath = Assembly.GetExecutingAssembly().Location; //string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath); //string configFilePath = assemblyDirPath + "\\log4net.config"; //log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath)); //log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); //配置和运行宿主服务 HostFactory.Run(x => { //方式二加载配置文件(配置文件和exe执行文件放在同一目录,配置文件属性设置成始终复制) x.UseLog4Net("log4net.config"); //x.UseLog4Net(); //注册服务 //x.Service(settings => new TopshelfService()); //x.Service<TopshelfService>(); x.Service<MqttService>(); //x.Service<TimerService>(s => //{ // s.ConstructUsing(name => new TimerService()); // s.WhenStarted(tc => tc.Start()); // s.WhenStopped(tc => tc.Stop()); // s.WhenPaused(tc => tc.Stop()); // s.WhenContinued(tc => tc.Start()); //}); //x.Service<DemoService>(s => //{ // //指定服务类型 // s.ConstructUsing(name => new DemoService()); // //当服务启动后执行什么 // s.WhenStarted(tc => tc.Start()); // //当服务停止后执行什么 // s.WhenStopped(tc => tc.Stop()); //}); //服务用本地系统账号来运行 x.RunAsLocalSystem(); //服务描述信息 x.SetDescription(description); //服务显示名称 x.SetDisplayName(displayName); //服务名称 x.SetServiceName(serviceName); ////服务描述信息 //x.SetDescription("Windows测试服务,不要删除"); ////服务显示名称 //x.SetDisplayName("Windows测试服务"); ////服务名称 //x.SetServiceName("TestService"); x.EnablePauseAndContinue(); }); } catch (Exception ex) { Console.WriteLine(ex); } } } }
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServiceName" value="TestService" /> <add key="DisplayName" value="Windows测试服务" /> <add key="Description" value="Windows测试服务,不要删除" /> <!--配置的应用唯一标识app 例: b2b_orderWeb--> <add key="configApp" value="Test.WindowsService" /> <!--配置的版本 例: 1.0.0.0--> <add key="configVerion" value="1.0.0.0" /> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration>
log4net.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--Console部分log输出格式的设定 --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message %newline"/> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="D:\vhost\logs\ExampleWindowsService\" /> <!--追加日志内容--> <appendToFile value="true"/> <!--可以为:Once|Size|Date|Composite--> <!--Composite为Size和Date的组合--> <rollingStyle value="Date"/> <!--当备份文件时,为文件名加的后缀,这里可以作为每一天的日志分别存储不同的文件--> <datePattern value="yyyy-MM-dd.TXT" /> <!--日志最大个数,都是最新的--> <!--rollingStyle节点为Size时,只能有value个日志--> <!--rollingStyle节点为Composite时,每天有value个日志--> <maxSizeRollBackups value="200" /> <!--可用的单位:KB|MB|GB--> <maximumFileSize value="20MB" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="false" /> <!--防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <!--日志输出格式:时间 日志类型 日志内容--> <conversionPattern value="%date [%thread] %-5level %logger - %message %newline" /> </layout> </appender> <root> <level value="ALL"/> <appender-ref ref="ConsoleAppender"/> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net> </configuration>
例如 “添加服务.bat” 或 Install.bat 内容如下:
@echo off echo 正在安装服务请稍等... set curdir=%~dp0 cd /d %curdir% ..\bin\Debug\Test.WindowsService.exe install echo ----------------------------- echo 服务安装成功 echo ----------------------------- echo 正在启动服务请稍等... net start TestService echo ----------------------------- echo 服务启动成功 echo ----------------------------- pause
“删除服务.bat” 或 unInstall.bat 内容如下:
@echo off echo 正在停止服务请稍等... net stop TestService echo ----------------------------- echo 服务停止成功 echo ----------------------------- echo 正在卸载服务请稍等... set curdir=%~dp0 cd /d %curdir% ..\bin\Debug\Test.WindowsService.exe uninstall echo ----------------------------- echo 服务卸载成功 echo ----------------------------- pause
快捷方式:以管理员身份运行bat文件安装和卸载
下面是用手动方式服务安装、启动和卸载
使用管理员身份cmd命令进入相应的文件夹位置
安装:Test.WindowsService.exe install
启动:Test.WindowsService.exe start
停止:Test.WindowsService.exe stop
卸载:Test.WindowsService.exe uninstall
方法三:
无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它
1. 以管理员身份运行cmd
2. 安装windows服务
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(InstallUtil.exe的路径,注意InstallUtil.exe的版本号需要和项目的版本号相同)
3. 安装windows服务
InstallUtil.exe D:\Service\需要安装的服务.exe(项目的路径)
4. 启动windows服务
net start TestServive(服务名称)