Skip to content

Commit 993b4ce

Browse files
authored
add handle signal (#16)
1 parent b36c6f0 commit 993b4ce

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

src/Utilities/Judge.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,9 @@ export abstract class JudgeAgent {
246246
extraMessage: String(err),
247247
};
248248
return {
249-
cases: range(this.judge.test?.cases.length ?? 1).map(() => e),
249+
cases: range(
250+
Math.max(this.judge.test?.cases.length ?? 0, 1)
251+
).map(() => e),
250252
};
251253
}
252254
}

src/index.ts

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,27 +93,58 @@ async function main() {
9393
controller.on("Exit", (args: ExitArgs) => {
9494
logger.warn(
9595
`控制端命令下线,原因:${args.reason ?? "无"},重连等待时间:${
96-
args?.reconnect?.delay ?? 0
96+
args?.reconnect?.delay ?? "NaN"
9797
} ms`
9898
);
9999
pendingExit = 1;
100-
exitInterval = setInterval(() => {
100+
const handler = () => {
101101
const col = stat.collect();
102102
if (col.judge.total === col.judge.finished) {
103-
controller.ws.close(1000, "控制端命令下线");
104103
controller.exitTimer = setTimeout(() => {
105104
process.exit(0);
106-
}, args?.reconnect?.delay);
105+
}, args?.reconnect?.delay ?? 200);
106+
controller.ws.close(1000, "控制端命令下线");
107107
clearInterval(exitInterval);
108108
}
109-
}, 3000);
109+
};
110+
handler();
111+
exitInterval = setInterval(handler, 3000);
110112
setTimeout(() => {
111113
controller.ws.close(1000, "控制端命令下线,但评测任务超时");
112114
process.exit(1);
113115
}, 300000);
114116
return Promise.resolve(null);
115117
});
116118

119+
const signalHandler = async (signal: NodeJS.Signals) => {
120+
const msg = `收到信号 ${signal},准备退出`;
121+
logger.warn(msg);
122+
await controller.do("Exit", { reason: msg });
123+
pendingExit = 1;
124+
const handler = () => {
125+
const col = stat.collect();
126+
if (col.judge.total === col.judge.finished) {
127+
controller.exitTimer = setTimeout(() => {
128+
process.exit(0);
129+
}, 200);
130+
controller.ws.close(1000, msg);
131+
clearInterval(exitInterval);
132+
}
133+
};
134+
handler();
135+
exitInterval = setInterval(handler, 3000);
136+
setTimeout(() => {
137+
controller.ws.close(
138+
1000,
139+
`收到信号 ${signal},准备退出,但评测任务超时`
140+
);
141+
process.exit(2);
142+
}, 9000);
143+
};
144+
145+
process.on("SIGINT", signalHandler);
146+
process.on("SIGTERM", signalHandler);
147+
117148
controller.on("CreateJudge", (task) => {
118149
if (pendingExit) {
119150
throw new Error("评测机正在等待下线");

0 commit comments

Comments
 (0)