1. WinSW 工具概述
WinSW(Windows Service Wrapper)是一个轻量级的、开源的工具,用于将任何可执行文件(包括exe、jar、脚本文件等)包装成一个Windows服务。这意味着,原本设计为命令行应用或需要手动启动的程序,可以通过WinSW配置成为能够在Windows系统后台自动启动、停止、重启的服务,而无需用户登录或进行额外的手动干预。
1.1. 主要特点
开源与轻量级:
- WinSW采用MIT许可证,完全开源,允许用户在其基础上进行修改和分发。
- 作为一个轻量级的工具,WinSW占用的系统资源较少,适合在各种规模的Windows系统上使用。
灵活配置:
- WinSW通过读取一个XML配置文件(通常命名为winsw.xml)来定义服务的行为。这个配置文件包含了服务的名称、可执行文件路径、启动参数、服务描述、日志配置等信息。
- 用户可以通过编辑XML配置文件来快速设置服务,而无需编写复杂的代码。
日志记录与故障排查:
- WinSW支持自定义日志输出位置和级别,方便用户进行故障排查和监控服务的运行状态。
灵活的进程管理:
-WinSW允许用户自定义启动、停止、重启命令以及相关的错误处理逻辑,提高了服务的稳定性和可靠性。
易于扩展、集成:
- 由于其简单易用的特性,WinSW常被用于Java应用、Node.js应用以及其他需要作为后台服务运行的场景。它可以帮助用户快速地将这些应用封装为Windows服务,实现自动化管理。
- WinSW支持通过插件机制添加自定义行为,如发送邮件通知、记录额外的日志信息等,满足了不同用户的个性化需求。
1.2. 使用场景
自动化任务:
如果你有一个需要持续运行的脚本或程序,WinSW可以将其变为一个服务,使得它能在每次系统启动时自动运行。
开发和测试:
对于开发者来说,WinSW可以快速部署和移除服务以进行测试,提高了开发效率。
第三方应用程序集成:
如果你的应用不原生支持Windows服务模式,WinSW可以作为一个适配器,将其封装为服务以实现自动化管理。
1.3. 使用方法
下载与安装:
用户可以从WinSW的GitHub仓库(https://github.com/winsw/winsw/releases)下载WinSW的exe文件,并将其重命名为方便记忆的名称(如winsw.exe)。
编写XML配置文件:
用户需要编写一个XML配置文件(如winsw.xml),定义服务的属性(如服务名称、可执行文件路径、启动参数等)。例如官方给出的例子:
<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>
<log mode="roll"></log>
</service>
配置文件说明详见:https://github.com/winsw/winsw/blob/master/doc/xmlConfigFile.md
安装与管理服务:
使用winsw.exe和XML配置文件,用户可以通过命令行来安装、启动、停止、重启和卸载服务。
Command | Description |
---|---|
install | Installs the service. |
uninstall | Uninstalls the service. |
start | Starts the service. |
stop | Stops the service. |
restart | Stops and then starts the service. |
status | Checks the status of the service. |
refresh | Refreshes the service properties without reinstallation. |
2. 实践过程
2.1. 编写服务配置文件:
创建了一个名为 NewPVMgrid.xml(或类似名称,但确保文件扩展名为 .xml)的服务配置文件。
在配置文件中,您定义了服务的 ID、名称、描述以及可执行文件(这里是批处理脚本 pvMonitor.bat)。
<service>
<id>pvmgrid</id>
<name>New PVMgrid</name>
<description>This service runs New PVMgrid Python script.</description>
<executable>D:\Python\NewPVMgrid\utils\pvMonitor.bat</executable>
</service>
2.2. 编写批处理脚本:
创建了一个名为 pvMonitor.bat 的批处理脚本,用于设置工作目录并调用 Python 脚本。
批处理脚本首先更改到包含 Python 脚本的目录,然后使用自定义的 Python 解释器(或重命名的 Python 解释器)来运行 MonitorProcess.py。
@echo off
D:
cd D:\Python\NewPVMgrid\utils
pvmonitor_py1 MonitorProcess.py
2.3. 配置 Python 环境:
将 Python 解释器重命名为 pvmonitor_py1(或类似名称),以便更容易地识别进程。
请注意,如果您将 Python 解释器重命名,则需要确保它仍然位于系统的 PATH 环境变量中,或者您需要在批处理脚本中使用完整路径来调用它。
2.4. 部署和测试:
使用 WinSW 提供的工具(如 WinSW.-x64exe被更名为NewPVMgrid.exe)来安装服务。
D:\Python\NewPVMgrid\utils>NewPVMgrid uninstall
2024-07-10 11:25:11,106 INFO - Uninstalling service 'New PVMgrid (pvmgrid)'...
2024-07-10 11:25:11,112 INFO - Service 'New PVMgrid (pvmgrid)' was uninstalled successfully.
D:\Python\NewPVMgrid\utils>NewPVMgrid install
2024-07-10 11:27:08,464 INFO - Installing service 'New PVMgrid (pvmgrid)'...
2024-07-10 11:27:08,483 INFO - Service 'New PVMgrid (pvmgrid)' was installed successfully.
在服务管理控制台(services.msc)中验证服务是否已正确安装并可以启动。
在任务管理器中看到的是Python 解释器重命名为 pvmonitor_py1
2.5. 实践中遇到的问题
2.5.1. 关于python与pythonw
- python:这是Python的标准解释器,用于在命令行界面(CLI)或脚本中执行Python代码。它允许输出显示在控制台或命令行窗口中,并且可以与用户进行交互(如读取输入)。
- pythonw:这个执行文件与python非常相似,但它设计用于运行不需要控制台窗口的图形界面(GUI)应用程序。使用pythonw时,不会打开命令行窗口,且所有输出默认被丢弃(除非重定向到文件或其他输出流)。
Windows服务管理器可能以特定的方式处理与pythonw相关的进程,这可能导致服务无法正确启动或管理。
2.5.2. 批处理中的start
@echo off
D:
cd D:\Python\NewPVMgrid\utils
start pvmonitor_py MonitorProcess.py
在批处理文件 pvMonitor.bat 中,使用了 start 命令来运行 Python 脚本。start 命令会启动一个新的窗口(即使使用了 start /B,但在某些情况下,特别是在服务上下文中,它可能不会按预期工作)来运行指定的程序。在服务中,通常不希望这样做,因为服务应该在后台无窗口地运行,去掉start即可。
3. 结论
WinSW是一个功能强大、易于使用的Windows服务封装工具,它通过将任何可执行文件包装为服务,实现了自动化管理和监控python程序。无论是开发者、系统管理员还是自动化爱好者,都可以通过WinSW来简化Windows服务的创建和管理过程。
参考:
温旧酒一壶~. WinSW将Python项目封装成Windows服务(软件开机自启). CSDN博客. 2024.05.28