@zhin.js/process-monitor 3.0.3 → 3.0.5
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/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/monitor.d.ts +12 -0
- package/lib/monitor.d.ts.map +1 -1
- package/lib/monitor.js +25 -14
- package/lib/monitor.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +2 -1
- package/src/monitor.ts +30 -14
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
|
|
2
|
-
export type { NotifyChannel, ProcessMonitorConfig, ProcessState } from './monitor.js';
|
|
1
|
+
export { classifyStartup, formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
|
|
2
|
+
export type { NotifyChannel, ProcessMonitorConfig, ProcessState, StartupReason } from './monitor.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
|
|
1
|
+
export { classifyStartup, formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
|
package/lib/monitor.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface ProcessMonitorConfig {
|
|
|
13
13
|
export interface ProcessState {
|
|
14
14
|
lastPid?: number;
|
|
15
15
|
lastStartTime?: number;
|
|
16
|
+
/** SIGTERM/SIGINT 正常退出时置 true,下次启动据此归为 restart 而非 crash。 */
|
|
17
|
+
cleanExit?: boolean;
|
|
16
18
|
restartCount: number;
|
|
17
19
|
crashCount: number;
|
|
18
20
|
totalUptime: number;
|
|
@@ -24,6 +26,16 @@ export declare function resolveProcessMonitorConfig(raw: ProcessMonitorConfig |
|
|
|
24
26
|
};
|
|
25
27
|
export declare function formatUptime(ms: number): string;
|
|
26
28
|
export declare function formatProcessStatus(): string;
|
|
29
|
+
export type StartupReason = 'start' | 'restart' | 'crash';
|
|
30
|
+
/**
|
|
31
|
+
* Classify this startup from persisted state.
|
|
32
|
+
* - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
|
|
33
|
+
* - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
|
|
34
|
+
*/
|
|
35
|
+
export declare function classifyStartup(state: ProcessState, currentPid: number, now?: number): {
|
|
36
|
+
reason: StartupReason;
|
|
37
|
+
uptime?: number;
|
|
38
|
+
};
|
|
27
39
|
/** Start monitoring once; returns disposer for lifecycle cleanup. */
|
|
28
40
|
export declare function startProcessMonitor(rawConfig?: ProcessMonitorConfig): () => void;
|
|
29
41
|
/** Test helper: reset module state without touching disk. */
|
package/lib/monitor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AAKpC,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACpC,QAAQ,CACT,IAAI,CACF,oBAAoB,EACpB,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAClE,CACF,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAQtC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AAKpC,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACpC,QAAQ,CACT,IAAI,CACF,oBAAoB,EACpB,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAClE,CACF,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAQtC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;AAkGD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,GAAG,SAAa,GACf;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ5C;AAuCD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA6BhF;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
|
package/lib/monitor.js
CHANGED
|
@@ -120,24 +120,33 @@ async function sendNotification(config, record) {
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Classify this startup from persisted state.
|
|
125
|
+
* - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
|
|
126
|
+
* - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
|
|
127
|
+
*/
|
|
128
|
+
export function classifyStartup(state, currentPid, now = Date.now()) {
|
|
129
|
+
if (!state.lastPid || !state.lastStartTime)
|
|
130
|
+
return { reason: 'start' };
|
|
131
|
+
if (state.lastPid === currentPid)
|
|
132
|
+
return { reason: 'start' };
|
|
133
|
+
const uptime = now - state.lastStartTime;
|
|
134
|
+
if (state.cleanExit === true || uptime >= 5 * 60 * 1000) {
|
|
135
|
+
return { reason: 'restart', uptime };
|
|
136
|
+
}
|
|
137
|
+
return { reason: 'crash', uptime };
|
|
138
|
+
}
|
|
123
139
|
async function detectStartupReason(config) {
|
|
124
140
|
const currentPid = process.pid;
|
|
125
141
|
const currentTime = Date.now();
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
processState.crashCount++;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
reason = 'restart';
|
|
136
|
-
processState.restartCount++;
|
|
137
|
-
}
|
|
138
|
-
uptime = timeSinceLastStart;
|
|
142
|
+
const { reason, uptime } = classifyStartup(processState, currentPid, currentTime);
|
|
143
|
+
if (reason === 'crash')
|
|
144
|
+
processState.crashCount++;
|
|
145
|
+
else if (reason === 'restart')
|
|
146
|
+
processState.restartCount++;
|
|
147
|
+
if (uptime)
|
|
139
148
|
processState.totalUptime += uptime;
|
|
140
|
-
|
|
149
|
+
processState.cleanExit = false;
|
|
141
150
|
processState.lastPid = currentPid;
|
|
142
151
|
processState.lastStartTime = currentTime;
|
|
143
152
|
saveProcessState();
|
|
@@ -168,9 +177,11 @@ export function startProcessMonitor(rawConfig) {
|
|
|
168
177
|
loadProcessState();
|
|
169
178
|
void detectStartupReason(config);
|
|
170
179
|
const onSigterm = () => {
|
|
180
|
+
processState.cleanExit = true;
|
|
171
181
|
saveProcessState();
|
|
172
182
|
};
|
|
173
183
|
const onSigint = () => {
|
|
184
|
+
processState.cleanExit = true;
|
|
174
185
|
saveProcessState();
|
|
175
186
|
};
|
|
176
187
|
process.on('SIGTERM', onSigterm);
|
package/lib/monitor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/process-monitor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.5",
|
|
4
4
|
"description": "进程监控与重启通知插件 (Plugin Runtime)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"directory": "plugins/features/process-monitor"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@zhin.js/command": "1.0.
|
|
42
|
-
"@zhin.js/plugin-runtime": "1.
|
|
43
|
-
"@zhin.js/tool": "1.0.
|
|
41
|
+
"@zhin.js/command": "1.0.3",
|
|
42
|
+
"@zhin.js/plugin-runtime": "1.1.1",
|
|
43
|
+
"@zhin.js/tool": "1.0.3"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^26.1.0",
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export {
|
|
2
|
+
classifyStartup,
|
|
2
3
|
formatProcessStatus,
|
|
3
4
|
formatUptime,
|
|
4
5
|
processState,
|
|
@@ -7,4 +8,4 @@ export {
|
|
|
7
8
|
startProcessMonitor,
|
|
8
9
|
startTime,
|
|
9
10
|
} from './monitor.js';
|
|
10
|
-
export type { NotifyChannel, ProcessMonitorConfig, ProcessState } from './monitor.js';
|
|
11
|
+
export type { NotifyChannel, ProcessMonitorConfig, ProcessState, StartupReason } from './monitor.js';
|
package/src/monitor.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface ProcessMonitorConfig {
|
|
|
23
23
|
export interface ProcessState {
|
|
24
24
|
lastPid?: number;
|
|
25
25
|
lastStartTime?: number;
|
|
26
|
+
/** SIGTERM/SIGINT 正常退出时置 true,下次启动据此归为 restart 而非 crash。 */
|
|
27
|
+
cleanExit?: boolean;
|
|
26
28
|
restartCount: number;
|
|
27
29
|
crashCount: number;
|
|
28
30
|
totalUptime: number;
|
|
@@ -184,27 +186,39 @@ async function sendNotification(
|
|
|
184
186
|
}
|
|
185
187
|
}
|
|
186
188
|
|
|
189
|
+
export type StartupReason = 'start' | 'restart' | 'crash';
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Classify this startup from persisted state.
|
|
193
|
+
* - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
|
|
194
|
+
* - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
|
|
195
|
+
*/
|
|
196
|
+
export function classifyStartup(
|
|
197
|
+
state: ProcessState,
|
|
198
|
+
currentPid: number,
|
|
199
|
+
now = Date.now(),
|
|
200
|
+
): { reason: StartupReason; uptime?: number } {
|
|
201
|
+
if (!state.lastPid || !state.lastStartTime) return { reason: 'start' };
|
|
202
|
+
if (state.lastPid === currentPid) return { reason: 'start' };
|
|
203
|
+
const uptime = now - state.lastStartTime;
|
|
204
|
+
if (state.cleanExit === true || uptime >= 5 * 60 * 1000) {
|
|
205
|
+
return { reason: 'restart', uptime };
|
|
206
|
+
}
|
|
207
|
+
return { reason: 'crash', uptime };
|
|
208
|
+
}
|
|
209
|
+
|
|
187
210
|
async function detectStartupReason(
|
|
188
211
|
config: ReturnType<typeof resolveProcessMonitorConfig>,
|
|
189
212
|
): Promise<void> {
|
|
190
213
|
const currentPid = process.pid;
|
|
191
214
|
const currentTime = Date.now();
|
|
192
|
-
let reason: 'start' | 'restart' | 'crash' = 'start';
|
|
193
|
-
let uptime: number | undefined;
|
|
194
215
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
processState.crashCount++;
|
|
200
|
-
} else {
|
|
201
|
-
reason = 'restart';
|
|
202
|
-
processState.restartCount++;
|
|
203
|
-
}
|
|
204
|
-
uptime = timeSinceLastStart;
|
|
205
|
-
processState.totalUptime += uptime;
|
|
206
|
-
}
|
|
216
|
+
const { reason, uptime } = classifyStartup(processState, currentPid, currentTime);
|
|
217
|
+
if (reason === 'crash') processState.crashCount++;
|
|
218
|
+
else if (reason === 'restart') processState.restartCount++;
|
|
219
|
+
if (uptime) processState.totalUptime += uptime;
|
|
207
220
|
|
|
221
|
+
processState.cleanExit = false;
|
|
208
222
|
processState.lastPid = currentPid;
|
|
209
223
|
processState.lastStartTime = currentTime;
|
|
210
224
|
saveProcessState();
|
|
@@ -241,9 +255,11 @@ export function startProcessMonitor(rawConfig?: ProcessMonitorConfig): () => voi
|
|
|
241
255
|
void detectStartupReason(config);
|
|
242
256
|
|
|
243
257
|
const onSigterm = () => {
|
|
258
|
+
processState.cleanExit = true;
|
|
244
259
|
saveProcessState();
|
|
245
260
|
};
|
|
246
261
|
const onSigint = () => {
|
|
262
|
+
processState.cleanExit = true;
|
|
247
263
|
saveProcessState();
|
|
248
264
|
};
|
|
249
265
|
process.on('SIGTERM', onSigterm);
|