


























@@ -325,6 +325,7 @@ export function runCommand(command, args, options = {}) {
325325let stderr = { text: "", truncatedChars: 0 };
326326let timedOut = false;
327327let forceKillTimer;
328+let forceKillAt;
328329let sampleTimer;
329330let resourceSampleInFlight = null;
330331let capturedResourceSampleCount = 0;
@@ -378,6 +379,7 @@ export function runCommand(command, args, options = {}) {
378379const timer = setTimeout(() => {
379380timedOut = true;
380381signalProcessGroup(child, "SIGTERM");
382+forceKillAt = Date.now() + timeoutKillGraceMs;
381383forceKillTimer = setTimeout(() => signalProcessGroup(child, "SIGKILL"), timeoutKillGraceMs);
382384forceKillTimer.unref();
383385}, timeoutMs);
@@ -390,6 +392,7 @@ export function runCommand(command, args, options = {}) {
390392child.on("error", (error) => {
391393clearTimeout(timer);
392394clearTimeout(forceKillTimer);
395+forceKillAt = undefined;
393396void stopResourceSampling().finally(() =>
394397reject(toLintErrorObject(error, "Command failed before exit")),
395398);
@@ -398,6 +401,7 @@ export function runCommand(command, args, options = {}) {
398401clearTimeout(timer);
399402const finish = () => {
400403clearTimeout(forceKillTimer);
404+forceKillAt = undefined;
401405void stopResourceSampling().then((resourceSampleFailure) => {
402406if (!timedOut && status === 0) {
403407if (resourceSampleFailure) {
@@ -439,7 +443,10 @@ export function runCommand(command, args, options = {}) {
439443};
440444441445if (timedOut) {
442-void finishTimedOutCommandProcessTree(child, timeoutKillGraceMs).then(finish, finish);
446+void finishTimedOutCommandProcessTree(child, {
447+ forceKillAt,
448+ timeoutKillGraceMs,
449+}).then(finish, finish);
443450return;
444451}
445452@@ -448,11 +455,18 @@ export function runCommand(command, args, options = {}) {
448455});
449456}
450457451-async function finishTimedOutCommandProcessTree(child, timeoutKillGraceMs) {
458+async function finishTimedOutCommandProcessTree(child, { forceKillAt, timeoutKillGraceMs }) {
452459if (!commandProcessTreeIsAlive(child)) {
453460return;
454461}
455-signalProcessGroup(child, "SIGKILL");
462+const graceRemainingMs =
463+forceKillAt === undefined ? timeoutKillGraceMs : Math.max(0, forceKillAt - Date.now());
464+if (graceRemainingMs > 0) {
465+await waitForCommandProcessTreeExit(child, graceRemainingMs);
466+}
467+if (commandProcessTreeIsAlive(child)) {
468+signalProcessGroup(child, "SIGKILL");
469+}
456470await waitForCommandProcessTreeExit(child, timeoutKillGraceMs);
457471}
458472此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。