@flun/windows 3.0.11 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -15
- package/LICENSE +34 -34
- package/README.md +248 -140
- package/bin/cli.js +218 -0
- package/copy-files.js +34 -34
- package/index.d.ts +133 -133
- package/lib/binaries.js +133 -133
- package/lib/daemon.js +66 -65
- package/package.json +6 -2
- package/win-service.config.js +68 -0
- package/sevWin.js +0 -18
package/README.md
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
# @flun/windows
|
|
2
2
|
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
3
5
|
本工具库能将您的 Node.js 应用程序作为 Windows 后台服务来运行和管理,支持服务的安装、启动、停止及卸载全流程;
|
|
4
6
|
还提供事件日志等功能,它主要用于面向生产环境应用程序的部署与运维;如需联系,邮箱: [open@flun.top](mailto:open@flun.top)
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
**本包基于 ESM 模块系统编写;**
|
|
7
9
|
|
|
8
10
|
- **推荐方式**:使用 `import` / `export` 语法,静态分析更友好,工具链兼容性最佳;
|
|
9
11
|
- **兼容方式**:Node.js ≥ 23.5.0 原生支持 `require(esm)`;22.12+ 需开启 `--experimental-require-module` 标志;
|
|
10
|
-
- **重要**:本文档所有示例均采用 **ESM 标准**,请确保你的项目 `package.json` 中已设置 `"type": "module"`,或将脚本后缀改为
|
|
12
|
+
- **重要**:本文档所有示例均采用 **ESM 标准**,请确保你的项目 `package.json` 中已设置 `"type": "module"`,或将脚本后缀改为
|
|
11
13
|
`.mjs`;
|
|
12
14
|
|
|
13
|
-
##
|
|
15
|
+
## 特性
|
|
14
16
|
|
|
15
17
|
@flun/windows 提供以下功能:
|
|
16
18
|
|
|
@@ -22,13 +24,40 @@
|
|
|
22
24
|
- _权限检测_:检测当前用户是否具有管理员权限
|
|
23
25
|
- _进程列表_:列出运行中的 Windows 进程/服务
|
|
24
26
|
- _终止进程_:通过 PID 终止特定进程
|
|
27
|
+
|
|
25
28
|
---
|
|
26
29
|
|
|
27
|
-
##
|
|
30
|
+
## 包目录结构
|
|
31
|
+
|
|
32
|
+
随包发布的文件:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
@flun/windows/
|
|
36
|
+
├── index.js 库入口,导出 elevate / sudo / isAdminUser / kill / list / Service / EventLogger
|
|
37
|
+
├── index.d.ts 类型声明
|
|
38
|
+
├── lib/binaries.js 外部二进制定位与提权调用
|
|
39
|
+
├── lib/cmd.js 进程列表与终止
|
|
40
|
+
├── lib/daemon.js Windows 服务管理类
|
|
41
|
+
├── lib/eventlog.js 事件日志写入
|
|
42
|
+
├── lib/winsw.js winsw 配置生成
|
|
43
|
+
├── lib/wrapper.js 进程包装器
|
|
44
|
+
├── lib/shared.js 共享工具函数
|
|
45
|
+
├── bin/winsw/ winsw 可执行文件(内部资源,非命令)
|
|
46
|
+
├── bin/elevate.vbs UAC 提权脚本(内部资源,非命令)
|
|
47
|
+
├── bin/cli.js 命令行入口
|
|
48
|
+
├── win-service.config.js 服务配置模板(全量字段,必填项带 *)
|
|
49
|
+
├── copy-files.js postinstall 复制二进制资源
|
|
50
|
+
├── package.json 包配置
|
|
51
|
+
├── README.md 本文件
|
|
52
|
+
├── CHANGELOG.md 更新日志
|
|
53
|
+
└── LICENSE 许可
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 安装前准备
|
|
28
57
|
|
|
29
58
|
### 允许安装脚本执行
|
|
30
59
|
|
|
31
|
-
本包在安装时可能触发某些依赖包的自动脚本(如 `postinstall` 等);如果你的 npm 全局配置或项目配置禁止了脚本执行(例如设置了
|
|
60
|
+
本包在安装时可能触发某些依赖包的自动脚本(如 `postinstall` 等);如果你的 npm 全局配置或项目配置禁止了脚本执行(例如设置了
|
|
32
61
|
`ignore-scripts=true`),可能会导致安装不完整或运行时异常;
|
|
33
62
|
|
|
34
63
|
推荐在项目根目录的 `package.json` 中添加 `allowScripts` 字段,显式放行本包及其依赖的脚本:
|
|
@@ -37,78 +66,167 @@
|
|
|
37
66
|
{
|
|
38
67
|
"allowScripts": {
|
|
39
68
|
"@flun/windows": true
|
|
40
|
-
// 如果依赖的其他包(如 bcrypt、electron-winstaller 等)也有脚本,请按需添加,格式相同
|
|
41
69
|
}
|
|
42
70
|
}
|
|
43
71
|
```
|
|
44
72
|
|
|
45
|
-
> 如果你信任所有安装包,也可以直接在项目 `.npmrc` 中设置 `allow-scripts = false`(表示关闭脚本拦截,所有脚本均允许执行),
|
|
46
|
-
或删除 `ignore-scripts` 字段;
|
|
47
|
-
|
|
48
73
|
---
|
|
49
74
|
|
|
50
75
|
## 安装
|
|
51
76
|
|
|
52
|
-
|
|
77
|
+
全局安装后可直接使用 `windows` 命令:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm i -g @flun/windows
|
|
81
|
+
```
|
|
53
82
|
|
|
54
|
-
|
|
83
|
+
局部安装时用 `npx windows` 调用,或在 `package.json` 的 `scripts` 中直接写 `windows`:
|
|
55
84
|
|
|
56
|
-
|
|
85
|
+
```bash
|
|
86
|
+
npm i @flun/windows
|
|
87
|
+
```
|
|
57
88
|
|
|
58
|
-
|
|
89
|
+
### 无原生模块依赖
|
|
59
90
|
|
|
60
91
|
Windows 上的原生 Node 模块安装复杂,通常需要 Visual Studio 和 node-gyp 进行编译;@flun/windows **不依赖任何原生模块**,
|
|
61
92
|
所有二进制工具均已预打包,无需安装 Visual Studio 等编译环境;
|
|
62
93
|
|
|
63
|
-
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 命令行
|
|
97
|
+
|
|
98
|
+
命令在 `npm scripts` 中运行时,工作目录取 `INIT_CWD`,即发起 npm 命令的项目根目录;
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
windows <命令> [--键 值]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
服务类命令默认读取你项目根目录的配置文件(`win-service.config.js`) ;如果命令行指令后加了 `--键 值` ,那么以命令配置为准;
|
|
105
|
+
|
|
106
|
+
### 快速开始
|
|
107
|
+
编辑`win-service.config.js`文件,填写带 `*` 的必填项 `name` 与 `script`;
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
windows install # 按配置文件安装并启动服务
|
|
111
|
+
|
|
112
|
+
windows install --name MyApp --script D:\app\main.js # 带参安装并启动
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
安装后默认启动服务;若只需安装,加 `--no-start`;
|
|
116
|
+
|
|
117
|
+
全局安装不触发 `postinstall`,可用 `windows example` 手动生成模板;
|
|
118
|
+
|
|
119
|
+
### 命令
|
|
120
|
+
|
|
121
|
+
#### 服务类
|
|
122
|
+
|
|
123
|
+
| 命令 | 说明 |
|
|
124
|
+
| ------------------ | --------------------------------------------- |
|
|
125
|
+
| `install` | 安装服务,装完默认启动;`--no-start` 只装不启动 |
|
|
126
|
+
| `uninstall` | 卸载服务 |
|
|
127
|
+
| `start` | 启动服务 |
|
|
128
|
+
| `stop` | 停止服务 |
|
|
129
|
+
| `restart` | 重启服务 |
|
|
130
|
+
| `status` | 查询状态,输出 0-3 |
|
|
131
|
+
| `xml` | 输出 winsw 配置 XML |
|
|
132
|
+
| `exe [--dir 目录]` | 生成 winsw 可执行文件 |
|
|
133
|
+
|
|
134
|
+
#### 其它
|
|
135
|
+
|
|
136
|
+
| 命令 | 说明 |
|
|
137
|
+
| ---------------------- | ------------------------------------------- |
|
|
138
|
+
| `list [--verbose]` | 列出运行中的进程 |
|
|
139
|
+
| `kill <pid> [--force]` | 结束进程 |
|
|
140
|
+
| `log <级别> <消息>` | 写事件日志 |
|
|
141
|
+
| `is-admin` | 检查当前是否管理员 |
|
|
142
|
+
| `elevate <命令...>` | 以管理员权限执行命令 |
|
|
143
|
+
| `example` | 生成 `win-service.config.js` 模板到当前项目 |
|
|
144
|
+
| `help` | 显示帮助 |
|
|
145
|
+
|
|
146
|
+
`status` 输出状态码:`0` 不存在;`1` 有服务无文件;`2` 有文件无服务;`3` 完整存在;
|
|
147
|
+
|
|
148
|
+
`log` 的级别取 `info`、`warn`、`error`、`success`、`failure`;`success` 与 `failure`
|
|
149
|
+
分别对应 `auditSuccess` 与 `auditFailure`;可加 `--source <名>` 指定事件源,`--id <号>` 指定事件 ID;
|
|
150
|
+
|
|
151
|
+
### 命令行参数示例
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# 前提:win-service.config.js 已提供 name 与 script;以下每条只覆盖部分字段
|
|
155
|
+
|
|
156
|
+
# 1. 覆盖描述:装出的服务在服务管理器中显示为该描述
|
|
157
|
+
windows install --description "我的服务"
|
|
158
|
+
|
|
159
|
+
# 2. 覆盖 node 启动参数:服务以 --harmony 模式运行
|
|
160
|
+
windows install --nodeOptions '["--harmony"]'
|
|
161
|
+
|
|
162
|
+
# 3. 打开出错退出:脚本运行出错时进程直接退出(省略值即 true)
|
|
163
|
+
windows install --abortOnError
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
字符串值用双引号,JSON 值用单引号(避免 shell 解析方括号);值先按 JSON 解析,失败则按字符串处理;
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 函数方式
|
|
171
|
+
|
|
172
|
+
### 快速开始
|
|
173
|
+
配置(`win-service.config.js`)必填项,详见[参考配置](#参考配置);
|
|
174
|
+
|
|
175
|
+
```js
|
|
176
|
+
// 创建并安装一个 Windows 服务:
|
|
177
|
+
import { Service } from '@flun/windows';
|
|
178
|
+
import config from './win-service.config.js';
|
|
179
|
+
|
|
180
|
+
const svc = new Service(config);
|
|
181
|
+
|
|
182
|
+
// 安装并自动启动服务(默认)
|
|
183
|
+
svc.install();
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
安装后可用 Windows 服务管理器、`NET START/STOP` 或 `sc` 命令管理;
|
|
187
|
+
|
|
188
|
+
### 配置功能
|
|
189
|
+
|
|
190
|
+
| 功能 | 类型 | 说明 |
|
|
191
|
+
| ------------- | ---- | ------------------------------------- |
|
|
192
|
+
| `Service` | 类 | Windows 服务管理,安装/卸载/启停 |
|
|
193
|
+
| `EventLogger` | 类 | 写入 Windows 事件日志 |
|
|
194
|
+
| `elevate` | 函数 | 以管理员权限运行命令(触发 UAC) |
|
|
195
|
+
| `sudo` | 函数 | 以管理员身份执行命令(需系统启用 sudo) |
|
|
196
|
+
| `isAdminUser` | 函数 | 检测当前用户是否具有管理员权限 |
|
|
197
|
+
| `list` | 函数 | 列出运行中的进程/服务 |
|
|
198
|
+
| `kill` | 函数 | 通过 PID 终止进程 |
|
|
199
|
+
|
|
200
|
+
以下各节为各导出的详细用法;
|
|
201
|
+
|
|
202
|
+
### Windows 服务管理
|
|
64
203
|
|
|
65
204
|
@flun/windows 可将 Node.js 脚本转换为 Windows 服务;注意:创建服务需要管理员权限!!
|
|
66
205
|
|
|
206
|
+
以下示例仅列常用项,全部可配置字段与默认值见[参考配置](#参考配置);
|
|
207
|
+
|
|
67
208
|
基础示例:
|
|
68
209
|
|
|
69
210
|
```js
|
|
70
211
|
import { Service } from '@flun/windows';
|
|
212
|
+
import config from './win-service.config.js';
|
|
71
213
|
|
|
72
|
-
|
|
73
|
-
const svc = new Service({
|
|
74
|
-
name: 'Hello World',
|
|
75
|
-
description: 'nodejs.org 示例服务器',
|
|
76
|
-
script: 'C:\\path\\to\\helloworld.js',
|
|
77
|
-
nodeOptions: [
|
|
78
|
-
'--harmony',
|
|
79
|
-
'--max-old-space-size=4096'
|
|
80
|
-
]
|
|
81
|
-
// ===== 其它可选配置 =====
|
|
82
|
-
//, maxRetries: null // 最大重试次数(默认null,表示忽略)
|
|
83
|
-
//, maxRestarts: 3 // 60秒内最大重启次数(默认3)
|
|
84
|
-
//, stoptimeout: 30 // 停止服务超时时间(秒,默认30)
|
|
85
|
-
//, wait: 1 // 重启等待时间(秒,默认1)
|
|
86
|
-
//, scriptOptions: '' // 传递给脚本的参数(默认空字符串)
|
|
87
|
-
//, stopparentfirst: false // 是否先停止父进程(默认false)
|
|
88
|
-
//, abortOnError: false // 遇到错误是否退出进程(默认false)
|
|
89
|
-
//, grow: 0.25 // 重启等待时间增长比例(默认0.25即25%)
|
|
90
|
-
//, logpath: null // 日志文件路径(默认null,使用默认路径)
|
|
91
|
-
//, logmode: 'rotate' // 日志模式('reset', 'roll', 'append')
|
|
92
|
-
//, execPath: process.execPath // Node.js可执行文件路径(默认当前Node)
|
|
93
|
-
//, logOnAs: {} // 服务运行的用户凭据('domain'、'account'、'password'和'mungeCredentialsAfterInstall')
|
|
94
|
-
//, env: undefined // 环境变量(默认:undefined)
|
|
95
|
-
//, logging: null // 日志配置(默认:mode = 'append', pattern = 'yyyMMdd', sizeThreshold = 10240, keepFiles
|
|
96
|
-
// = 8)
|
|
97
|
-
//, allowServiceLogon: undefined // 允许服务登录(默认undefined)
|
|
98
|
-
//, workingDirectory: process.cwd() // 工作目录(默认当前目录)
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
// 监听安装完成事件
|
|
102
|
-
svc.on('install', ()=>{
|
|
103
|
-
svc.start();
|
|
104
|
-
});
|
|
214
|
+
const svc = new Service(config);
|
|
105
215
|
|
|
216
|
+
// 安装并自动启动服务(默认)
|
|
106
217
|
svc.install();
|
|
218
|
+
|
|
219
|
+
// 只安装,不自动启动
|
|
220
|
+
// svc.install(undefined, false);
|
|
107
221
|
```
|
|
108
222
|
|
|
109
223
|
服务创建后可通过 Windows 服务管理器、`NET START/STOP` 或 `sc` 命令管理;
|
|
110
224
|
|
|
111
|
-
|
|
225
|
+
默认情况下,各方法执行后会在终端打印结果(如 `服务安装完成;`);
|
|
226
|
+
若将本包嵌入到生产项目,终端输出会混入宿主日志,可在配置中设 `quiet: true`,
|
|
227
|
+
此时库只发事件、不打印,通过下方事件获取状态;命令行方式恒为 `quiet`,不受此字段影响;
|
|
228
|
+
|
|
229
|
+
#### 支持的事件
|
|
112
230
|
|
|
113
231
|
- _install_ - 服务安装完成
|
|
114
232
|
- _alreadyinstalled_ - 服务已存在
|
|
@@ -119,81 +237,63 @@ svc.install();
|
|
|
119
237
|
- _stop_ - 服务停止
|
|
120
238
|
- _error_ - 发生错误
|
|
121
239
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
通过 `scriptOptions` 配置:
|
|
240
|
+
#### 环境变量设置
|
|
125
241
|
|
|
126
|
-
|
|
127
|
-
import { Service } from '@flun/windows';
|
|
128
|
-
const svc1 = new Service({
|
|
129
|
-
..., // 基本配置略...
|
|
130
|
-
scriptOptions: '-c C:\\config\\special.conf -i'
|
|
131
|
-
});
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### 环境变量设置
|
|
135
|
-
|
|
136
|
-
`@flun/windows` 会自动向服务进程注入 `USERPROFILE` 环境变量,其值为**安装服务时当前登录用户的主目录**(例如
|
|
242
|
+
`@flun/windows` 会自动向服务进程注入 `USERPROFILE` 环境变量,其值为**安装服务时当前登录用户的主目录**(例如
|
|
137
243
|
`C:\Users\你的用户名`;
|
|
138
244
|
这确保了服务中调用 `os.homedir()` 能返回正确的用户目录,即使服务以 `LocalSystem` 等系统账户运;
|
|
139
245
|
|
|
140
246
|
**你通常不需要手动设置 `USERPROFILE`**,如需添加其他自定义环境变量,可按以下方式:
|
|
141
247
|
|
|
142
248
|
```js
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
script: 'C:\\app\\server.js',
|
|
249
|
+
// win-service.config.js
|
|
250
|
+
export default {
|
|
251
|
+
// ...其余字段
|
|
147
252
|
env: {
|
|
148
253
|
MY_CUSTOM_VAR: 'some value',
|
|
149
|
-
ANOTHER_VAR: 'hello'
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// 也支持数组形式
|
|
153
|
-
const svc2 = new Service({
|
|
154
|
-
...,
|
|
155
|
-
env: [
|
|
156
|
-
{ name: 'VAR1', value: 'value1' },
|
|
157
|
-
{ name: 'VAR2', value: 'value2' }
|
|
158
|
-
]
|
|
159
|
-
});
|
|
254
|
+
ANOTHER_VAR: 'hello',
|
|
255
|
+
},
|
|
256
|
+
};
|
|
160
257
|
```
|
|
161
258
|
|
|
162
|
-
|
|
259
|
+
也支持数组形式,元素为 `{ name, value }`:
|
|
163
260
|
|
|
164
261
|
```js
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
262
|
+
// win-service.config.js
|
|
263
|
+
export default {
|
|
264
|
+
// ...其余字段
|
|
265
|
+
env: [
|
|
266
|
+
{ name: 'VAR1', value: 'value1' },
|
|
267
|
+
{ name: 'VAR2', value: 'value2' },
|
|
268
|
+
],
|
|
269
|
+
};
|
|
170
270
|
```
|
|
171
271
|
|
|
172
|
-
|
|
272
|
+
#### 用户账户配置
|
|
173
273
|
|
|
174
274
|
```js
|
|
175
275
|
import { Service } from '@flun/windows';
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
276
|
+
import config from './win-service.config.js';
|
|
277
|
+
|
|
278
|
+
const svc = new Service(config);
|
|
179
279
|
|
|
180
280
|
// 安装后指定特定用户或凭据以登录运行
|
|
181
281
|
svc.logOnAs.domain = 'mydomain.local';
|
|
182
282
|
svc.logOnAs.account = 'username';
|
|
183
283
|
svc.logOnAs.password = 'password';
|
|
184
|
-
svc.logOnAs.mungeCredentialsAfterInstall
|
|
284
|
+
svc.logOnAs.mungeCredentialsAfterInstall = true; // 默认
|
|
185
285
|
```
|
|
186
|
-
>
|
|
187
|
-
使你的应用能够正确获取当前登录用户的目录(例如读取用户目录下的配置文件);因此,你不需要为了修正 `os.homedir()` 而特意配置
|
|
286
|
+
> **提示**:即使你使用默认的 `LocalSystem` 账户运行服务,`@flun/windows` 也会通过自动注入 `USERPROFILE` 环境变量,
|
|
287
|
+
使你的应用能够正确获取当前登录用户的目录(例如读取用户目录下的配置文件);因此,你不需要为了修正 `os.homedir()` 而特意配置
|
|
188
288
|
`logOnAs` 账户和密码;
|
|
189
289
|
|
|
190
|
-
|
|
290
|
+
#### 服务卸载
|
|
191
291
|
|
|
192
292
|
```js
|
|
193
293
|
import { Service } from '@flun/windows';
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
294
|
+
import config from './win-service.config.js';
|
|
295
|
+
|
|
296
|
+
const svc = new Service(config);
|
|
197
297
|
svc.on('uninstall', ()=>{
|
|
198
298
|
console.log('卸载完成');
|
|
199
299
|
console.log('服务是否存在:', svc.exists);
|
|
@@ -209,29 +309,13 @@ svc.uninstall();
|
|
|
209
309
|
|
|
210
310
|
注:卸载仅移除服务相关文件,**不会删除您的 Node.js 脚本**;
|
|
211
311
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
@flun/windows 提供可配置的重启策略:
|
|
215
|
-
|
|
216
|
-
```js
|
|
217
|
-
import { Service } from '@flun/windows';
|
|
218
|
-
const svc = new Service({
|
|
219
|
-
..., // 基本配置略...
|
|
220
|
-
wait: 2, // 初始等待时间(秒)
|
|
221
|
-
grow: 0.5, // 等待时间增长比例(50%)
|
|
222
|
-
maxRetries: 5, // 最大重试次数
|
|
223
|
-
maxRestarts: 3 // 60秒内最大重启次数
|
|
224
|
-
});
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### 服务实现原理
|
|
312
|
+
#### 服务实现原理
|
|
228
313
|
|
|
229
|
-
使用 [winsw]为每个服务生成独立的 `.exe` 和 `.xml` 配置文件,存储在脚本所在目录的 `daemon` 子文件夹中;服务日志可通过 Windows
|
|
314
|
+
使用 [winsw]为每个服务生成独立的 `.exe` 和 `.xml` 配置文件,存储在脚本所在目录的 `daemon` 子文件夹中;服务日志可通过 Windows
|
|
230
315
|
事件查看器查看;
|
|
231
316
|
此外,服务启动时会自动设置 `USERPROFILE` 环境变量为安装服务时当前用户的用户目录,保证路径相关 API 的行为与预期一致;
|
|
232
|
-
---
|
|
233
317
|
|
|
234
|
-
|
|
318
|
+
### 事件日志系统
|
|
235
319
|
|
|
236
320
|
@flun/windows 提供非 C++ 依赖的事件日志功能:
|
|
237
321
|
|
|
@@ -256,11 +340,9 @@ const eLog2 = new EventLogger({
|
|
|
256
340
|
});
|
|
257
341
|
```
|
|
258
342
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
# 系统命令工具
|
|
343
|
+
### 系统命令工具
|
|
262
344
|
|
|
263
|
-
|
|
345
|
+
#### elevate(权限提升)
|
|
264
346
|
|
|
265
347
|
`elevate` 类似于 Linux/Mac 上的 `sudo`,它会尝试将当前用户的权限提升为本地管理员;但要求当前用户具有管理员权限,
|
|
266
348
|
若无管理员权限,命令将失败并返回 `access denied` 错误;
|
|
@@ -275,12 +357,8 @@ const eLog2 = new EventLogger({
|
|
|
275
357
|
import { elevate } from '@flun/windows';
|
|
276
358
|
// 基本用法
|
|
277
359
|
elevate('echo "Hello World" && whoami',{}, (error, stdout, stderr) => {
|
|
278
|
-
if (error)
|
|
279
|
-
|
|
280
|
-
} else {
|
|
281
|
-
console.log('执行成功,输出:', stdout);
|
|
282
|
-
console.log('错误输出:', stderr);
|
|
283
|
-
}
|
|
360
|
+
if (error) console.error('执行失败:', error);
|
|
361
|
+
else console.log('执行成功,输出:', stdout), console.log('错误输出:', stderr);
|
|
284
362
|
});
|
|
285
363
|
|
|
286
364
|
// 带选项参数
|
|
@@ -291,7 +369,7 @@ elevate('echo "Hello World" && whoami', (err, stdout)=> { }); // options视为
|
|
|
291
369
|
elevate('echo "Hello World" && whoami'); // 无回调
|
|
292
370
|
```
|
|
293
371
|
|
|
294
|
-
|
|
372
|
+
#### sudo(管理员执行)
|
|
295
373
|
|
|
296
374
|
`sudo` 与 Linux/Mac 上的 `sudo` 类似;与 `elevate` 雷同,但稳定性更高,这仍要求用户具有管理员权限,
|
|
297
375
|
并且需在Windows上启用sudo命令,否则命令将失败;
|
|
@@ -311,10 +389,7 @@ import { sudo } from '@flun/windows';
|
|
|
311
389
|
// 基本用法 - 命令、选项和回调
|
|
312
390
|
sudo('echo "Hello World" && whoami', {}, (error, stdout, stderr) => {
|
|
313
391
|
if (error) console.error('执行失败:', error);
|
|
314
|
-
else
|
|
315
|
-
console.log('执行成功,输出:', stdout);
|
|
316
|
-
console.log('错误输出:', stderr);
|
|
317
|
-
}
|
|
392
|
+
else console.log('执行成功,输出:', stdout), console.log('错误输出:', stderr);
|
|
318
393
|
});
|
|
319
394
|
|
|
320
395
|
// 带选项参数
|
|
@@ -323,7 +398,7 @@ sudo('echo "Hello World" && whoami', {cwd:'C:\\'}, callback);
|
|
|
323
398
|
sudo('echo "Hello World" && whoami' ); // 无回调
|
|
324
399
|
```
|
|
325
400
|
|
|
326
|
-
|
|
401
|
+
#### 管理员权限检测
|
|
327
402
|
|
|
328
403
|
此异步命令用于判断当前用户是否拥有管理员权限;它会向回调函数传递一个布尔值,如果用户是管理员则返回 `true`,否则返回 `false`;
|
|
329
404
|
|
|
@@ -339,7 +414,7 @@ isAdminUser(isAdmin => {
|
|
|
339
414
|
});
|
|
340
415
|
```
|
|
341
416
|
|
|
342
|
-
|
|
417
|
+
#### 进程列表
|
|
343
418
|
|
|
344
419
|
获取运行中的 Windows 进程/服务列表;
|
|
345
420
|
|
|
@@ -350,22 +425,53 @@ list(processes => {
|
|
|
350
425
|
}, true); // true 显示详细信息
|
|
351
426
|
```
|
|
352
427
|
|
|
353
|
-
|
|
428
|
+
#### 终止进程
|
|
354
429
|
|
|
355
|
-
|
|
430
|
+
通过进程 PID 终止特定进程;
|
|
356
431
|
|
|
357
432
|
```js
|
|
358
433
|
import { kill } from '@flun/windows';
|
|
359
|
-
kill(
|
|
434
|
+
kill(PID, () => {
|
|
360
435
|
console.log('进程已终止');
|
|
361
436
|
});
|
|
362
437
|
```
|
|
363
438
|
|
|
364
439
|
---
|
|
365
440
|
|
|
366
|
-
|
|
441
|
+
## 参考配置
|
|
442
|
+
|
|
443
|
+
以下为 `win-service.config.js` 的字段说明,属查阅性内容,使用前无需通读;
|
|
444
|
+
带 * 的字段为必填项;
|
|
445
|
+
|
|
446
|
+
| 参数 | 作用 |
|
|
447
|
+
| ------------------- | -------------------------------------------------------------------------------- |
|
|
448
|
+
| `name` * | 服务名称,同时作为注册表与服务标识;不能含 `<>:"\/` 与 `?*` 及竖线 |
|
|
449
|
+
| `script` * | 启动服务的入口脚本绝对路径 |
|
|
450
|
+
| `description` | 服务描述,显示在服务管理器中;默认空字符串 |
|
|
451
|
+
| `nodeOptions` | 传递给 node 进程的选项;默认 `--harmony` |
|
|
452
|
+
| `scriptOptions` | 传递给脚本的选项;默认空字符串 |
|
|
453
|
+
| `execPath` | node 可执行文件路径;默认取当前进程 `execPath` |
|
|
454
|
+
| `workingDirectory` | 服务工作目录;默认取当前工作目录 |
|
|
455
|
+
| `maxRetries` | 无响应或故障前的最大重试次数;默认 `null`,不启用 |
|
|
456
|
+
| `maxRestarts` | 60 秒内最大重启次数;默认 `3`,`0` 表示不启用 |
|
|
457
|
+
| `stoptimeout` | 停止服务的超时秒数;默认 `30` |
|
|
458
|
+
| `wait` | 脚本停止后等待重启的秒数;默认 `1` |
|
|
459
|
+
| `grow` | 重启等待时间的增长百分比;默认 `0.25` |
|
|
460
|
+
| `abortOnError` | 脚本运行错误时是否退出进程;默认 `false` |
|
|
461
|
+
| `stopparentfirst` | 是否先停止父进程;默认 `false` |
|
|
462
|
+
| `logpath` | 日志文件路径;默认与可执行文件同目录 |
|
|
463
|
+
| `logmode` | 日志模式,取 `rotate`、`truncate`、`append`;默认 `rotate` |
|
|
464
|
+
| `env` | 环境变量,形如 `{ name, value }` 或同构数组 |
|
|
465
|
+
| `logging` | 日志配置对象,可替代 `logmode`;含 `mode`、`pattern`、`sizeThreshold`、`keepFiles` |
|
|
466
|
+
| `logOnAs` | 服务登录凭据,含 `account`、`password`、`domain`、`mungeCredentialsAfterInstall` |
|
|
467
|
+
| `allowServiceLogon` | 是否允许服务登录 |
|
|
468
|
+
| `quiet` | 为 `true` 时不打印执行结果,只发事件;默认 `false`;命令行方式恒为 `true` |
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## 常见问题
|
|
367
473
|
|
|
368
|
-
|
|
474
|
+
### elevate 和 sudo 函数常见问题
|
|
369
475
|
|
|
370
476
|
1. **sudo 函数执行失败**:这可能是因为 `sudo.exe` 外部工具不兼容当前系统,建议使用 `elevate` 函数作为替代
|
|
371
477
|
|
|
@@ -375,17 +481,19 @@ kill(进程PID, () => {
|
|
|
375
481
|
|
|
376
482
|
4. **sudo 函数需要在系统中设置并启用sudo**
|
|
377
483
|
|
|
378
|
-
|
|
484
|
+
### 服务管理常见问题
|
|
379
485
|
|
|
380
486
|
- `invalidinstallation` 错误通常表示 daemon 目录文件不完整
|
|
381
487
|
- 卸载时若文件被锁定,可重新运行卸载或手动删除 `daemon` 目录
|
|
382
488
|
|
|
383
489
|
---
|
|
384
490
|
|
|
385
|
-
|
|
491
|
+
## 许可证
|
|
492
|
+
|
|
493
|
+
winsw 和 sudowin 遵循各自所有者的许可证;@flun/windows 核心代码采用 ISC 许可证(具体内容请见许可证文档)
|
|
386
494
|
|
|
387
|
-
|
|
495
|
+
---
|
|
388
496
|
|
|
389
|
-
|
|
497
|
+
## 贡献
|
|
390
498
|
|
|
391
|
-
|
|
499
|
+
感谢所有贡献者,特别感谢 @arthurblake、@hockeytim11 等开发者的贡献;
|