美文网首页野生技术宅协会程序员小程序
用winsw让任何Windows程序都能运行为服务

用winsw让任何Windows程序都能运行为服务

作者: 乐百川 | 来源:发表于2017-04-10 18:54 被阅读2217次

    winsw介绍

    有时候我们需要在Windows下开机运行某些程序,这对于有图形界面的程序来说一般不是什么事,在选项中选中开机启动,然后它们就可以自动运行了。但是如果我们想运行一些命令行程序的话就没这么方便了。

    原来我的做法是写一个bat脚本,然后将它的快捷方式复制到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp,这样就可以开机自启了。不过这种方式有一个非常大的缺点,就是开机之后会显示一个命令行窗口!而且这个窗口还不能关,一关程序就停了。

    其实Windows自带了一个后台程序管理的功能,就是我们经常用到的服务。但是Windows的服务只有程序的开发者在写程序的时候引用到这个功能,我们才能利用服务来控制程序的启动和关闭。对于一般的命令行程序来说,没办法利用服务。所以今天我们就来使用一下标题的这个winsw。它可以将Windows上的任何一个程序注册为服务,如果不需要,也可以方便的卸载服务。

    使用winsw

    下载

    首先要下载winsw。它是一个单个的可执行文件,我们到Github release这里就可以下载winsw了。一般来说当然是下载最新的。winsw可以运行在.NET2和.NET4两个版本上,当然如果使用Win10等比较新的系统,最好下载更新版本的.NET。

    下载完之后最好把文件改成一个比较短小的名字,例如winsw.exe这样的,方便后面输入命令。

    编写配置文件

    我们需要编写一个和程序同名的XML文件作为winsw的配置文件。文件大体上长这样,这是官网的例子。

        <service>
          <id>jenkins</id>
          <name>Jenkins</name>
          <description>This service runs Jenkins continuous integration system.</description>
          <env name="JENKINS_HOME" value="%BASE%"/>
          <executable>java</executable>
          <arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
          <logmode>rotate</logmode>
        </service>
    

    看到XML的标签名,我想大家也能猜到这些参数是干嘛的,所以我就不介绍了。下面是我的一个配置文件例子。

    <service>
        <id>kcp</id>
        <name>kcp</name>
        <description>这个服务用来将ss使用kcp协议加速</description>
        <executable>client_windows_amd64</executable>
        <arguments>-c kcp-config.json</arguments>
        <logmode>reset</logmode>
    </service>
    

    注册服务

    编写好配置文件之后,记得把配置文件和可执行文件放在一起,这样winsw才能正确识别配置文件。然后我们打开一个管理员权限的命令提示符或Powershell窗口,然后输入下面的命令,如果返回值为0,说明已将程序注册为服务。

    winsw install
    

    然后打开Windows的服务,我们可以看到这下已经出现了注册的服务,我们可以像一般服务那样开启、关闭它。

    服务

    如果不再需要这个服务,使用winsw uninstall即可卸载服务。当然还有诸如startstop这样的命令启动和关闭服务。更重要的是,没有那个既不美观又烦人的命令提示符窗口。

    相关文章

      网友评论

      • GoTop:这个软件太好用了,多谢推荐
      • 笨笨song:Java程序的jar包,直接start.bat里执行Java命令可以成功,注册服务在服务列表里能看到,但是启动失败,提示unable to access jarfile,求帮助
        乐百川:@笨笨song 你的是不是spring boot打包的程序,如果是的话我在爆栈上搜到一个结果,需要在application.properties文件中写下面两行来指定一下数据源配置。
        ```
        spring.datasource.url = …
        spring.datasource.driver-class-name = …
        ```
        笨笨song:@乐百川 路径有点问题,写的相对路径改成绝对路径了,现在没有报那个错误了,出现了新的错误,“Cannot determine embedded database driver class for database type NONE ”,不知道咋回事,同样的数据源配置信息,直接运行程序可以,在start.bat里执行Java命令也可以,能否帮我看下
        乐百川:是不是你路径写的有问题啊

      本文标题:用winsw让任何Windows程序都能运行为服务

      本文链接:https://www.haomeiwen.com/subject/cxheattx.html