15 个版本 (7 个稳定版)

1.5.0 2024年3月2日
1.4.0 2023年12月4日
1.3.0 2023年10月1日
1.2.0 2023年5月19日
0.4.0 2019年10月5日

#21 in Windows API

Download history 16/week @ 2024-03-31 1/week @ 2024-04-07 5/week @ 2024-05-19 1/week @ 2024-05-26 6/week @ 2024-06-02 1/week @ 2024-06-09

每月 347 次下载

MIT 许可证

82KB
2K SLoC

Shawl

Shawl 是一个用于将任意程序作为 Windows 服务运行的包装器,使用 Rust 编写。它为您处理 Windows 服务 API,因此您的程序只需要响应 ctrl-C/SIGINT。如果您正在创建需要作为服务运行的项,只需将 Shawl 与您的项目捆绑在一起,将其设置为入口点,并通过 CLI 传递要运行的命令即可。

安装

  • 预构建的二进制文件可在 发布页面 上找到。它是便携式的,因此您可以简单地下载它并放在任何地方,无需通过安装程序。
  • 如果您已安装 Rust,则可以运行 cargo install shawl
  • 如果您有 Scoop
    • 安装: scoop bucket add extras && scoop install shawl
    • 更新: scoop update && scoop update shawl

用法

以下是使用 Shawl 创建服务的一个示例(请注意,-- 用于将 Shawl 的选项与您希望它运行的命令分开)

  • 使用 Shawl 的 add 命令
    • shawl add--name my-app--C:/path/my-app.exe
  • 使用 Windows 的 sc 命令进行更多控制
    • sc create my-app binPath= "C:/path/shawl.exe run --name my-app -- C:/path/my-app.exe"
  • 然后像通常一样启动或配置服务
    • sc config my-app start= auto
      sc start my-app
      

Shawl 将检查您的程序状态,以便向 Windows 报告正确状态

  • 默认情况下,当您的程序退出时,如果退出码非零,Shawl会重新启动它。您可以使用--(no-)restart对所有退出码进行自定义或对特定退出码使用--restart-if(-not)。请注意,这四个选项是互斥的。
  • 当请求停止服务时,Shawl会向您的程序发送ctrl-C事件,然后等待最多3000毫秒(基于--stop-timeout),如果需要则强制终止进程。
  • 在任何情况下,如果Shawl没有重新启动您的程序,那么它将退出码报告给Windows作为服务特定的错误,除非退出码为0或您使用--pass配置的代码。

命令行界面

您可以在docs/cli.md中查看完整的命令行帮助文本。

日志记录

Shawl为每个服务创建一个日志文件,文件名为shawl_for_<service>_*.log(基于--name),位于Shawl可执行文件相同的目录中,包含其自己的消息以及它运行的命令的输出。如果出现问题,您可以通过阅读日志来了解更多信息。您可以使用--no-log禁用所有日志记录,也可以使用--no-log-cmd仅禁用命令日志。默认情况下,每个日志文件限制为2 MB,最多保留2个旋转副本。

账户

请注意,新服务的默认账户是本地系统账户,它具有与您的用户账户不同的PATH环境变量。如果您将Shawl配置为运行类似npm start的命令,这意味着npm需要位于本地系统账户的PATH中,或者您也可以更改服务使用的账户。

另外,请注意,使用本地系统账户运行服务与以root身份运行Unix服务一样危险。如果您为即将包装的服务公开端口,这将大大增加系统被黑客攻击的风险。建议您使用受限账户,如网络服务,来运行服务。为此,首先授予网络服务账户对Shawl安装目录的读取、写入和执行权限,然后执行sc config my-app obj= "NT AUTHORITY\Network Service" password= ""。如果服务需要读取和写入文件,您可能还需要授予网络服务对服务想要访问的目录的权限。有关Windows服务用户账户的更多信息,请参阅这里

恢复

如果您想在Shawl放弃尝试重新启动包装的命令时使用Windows本身的“启用错误停止操作”功能,请确保在服务属性中启用此选项。

与其他工具的比较

Shawl 与现有的解决方案(如 WinSWNSSM)不同,因为这些解决方案需要运行特殊的安装命令来准备服务。在例如通过 MSI 安装服务的情况下,您需要运行 CustomAction,这可能会带来不便。使用 Shawl,您可以按需配置服务,例如使用正常的 MSI ServiceInstall 或通过运行 sc create,因为 Shawl 没有自己特殊的设置。 shawl add 命令只是一个可选的便利功能。

开发

请参阅 CONTRIBUTING.md

依赖

~6–19MB
~228K SLoC