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
每月 347 次下载
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 与现有的解决方案(如 WinSW 和 NSSM)不同,因为这些解决方案需要运行特殊的安装命令来准备服务。在例如通过 MSI 安装服务的情况下,您需要运行 CustomAction
,这可能会带来不便。使用 Shawl,您可以按需配置服务,例如使用正常的 MSI ServiceInstall
或通过运行 sc create
,因为 Shawl 没有自己特殊的设置。 shawl add
命令只是一个可选的便利功能。
开发
请参阅 CONTRIBUTING.md。
依赖
~6–19MB
~228K SLoC