From 7e1cfca977b37d5d80901c7d3187c090b0fa5a17 Mon Sep 17 00:00:00 2001 From: Albert Date: Mon, 12 Apr 2021 21:10:05 +0800 Subject: [PATCH 1/2] fix: Application did not exit on watch process abnormal exit link https://github.com/nestjs/nest-cli/issues/1124 --- actions/start.action.ts | 3 +- lib/utils/tree-kill.ts | 81 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 lib/utils/tree-kill.ts diff --git a/actions/start.action.ts b/actions/start.action.ts index f3bae2990..20531740a 100644 --- a/actions/start.action.ts +++ b/actions/start.action.ts @@ -3,6 +3,7 @@ import { spawn } from 'child_process'; import * as fs from 'fs'; import { join } from 'path'; import * as killProcess from 'tree-kill'; +import { treeKillSync as killProcessSync } from '../lib/utils/tree-kill'; import { Input } from '../commands'; import { getValueOrDefault } from '../lib/compiler/helpers/get-value-or-default'; import { Configuration } from '../lib/configuration'; @@ -85,7 +86,7 @@ export class StartAction extends BuildAction { let childProcessRef: any; process.on( 'exit', - () => childProcessRef && killProcess(childProcessRef.pid), + () => childProcessRef && killProcessSync(childProcessRef.pid), ); return () => { diff --git a/lib/utils/tree-kill.ts b/lib/utils/tree-kill.ts new file mode 100644 index 000000000..d3e21c1f6 --- /dev/null +++ b/lib/utils/tree-kill.ts @@ -0,0 +1,81 @@ +import { execSync } from 'child_process'; + +export function treeKillSync(pid: number, signal?: string | number): void { + + if (process.platform === "win32") { + execSync('taskkill /pid ' + pid + ' /T /F'); + return; + } + + const childs = getAllChilds(pid); + + childs.forEach(function (pid) { + killPid(pid, signal); + }); + + killPid(pid, signal); + return +} + +function getAllPid(): { + pid: number, + ppid: number +}[] { + const rows = execSync('ps -A -o pid,ppid') + .toString() + .trim() + .split('\n') + .slice(1); + + return rows.map(function (row) { + var parts = row.match(/\s*(\d+)\s*(\d+)/); + + if (parts === null) { + return null; + } + + return { + pid: Number(parts[1]), + ppid: Number(parts[2]) + }; + }).filter((input: null | undefined | T): input is T => { + return input != null; + }); +} + +function getAllChilds(pid: number) { + const allpid = getAllPid(); + + let ppidHash: { + [key: number]: number[] + } = {}; + + let result: number[] = []; + + allpid.forEach(function (item) { + ppidHash[item.ppid] = ppidHash[item.ppid] || []; + ppidHash[item.ppid].push(item.pid); + }); + + const find = function (pid: number) { + ppidHash[pid] = ppidHash[pid] || []; + ppidHash[pid].forEach(function (childPid) { + result.push(childPid); + find(childPid); + }); + }; + + find(pid); + + return result; +} + +function killPid(pid: number, signal?: string | number) { + try { + process.kill(pid, signal); + } catch (err) { + if (err.code !== 'ESRCH') { + throw err; + } + } +} \ No newline at end of file From 111e39f4a3cc2bb3d8b7f14042444e0d7778f87c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20My=C5=9Bliwiec?= Date: Tue, 27 Jul 2021 13:29:28 +0200 Subject: [PATCH 2/2] style(): minor formatting changes --- lib/utils/tree-kill.ts | 117 ++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/lib/utils/tree-kill.ts b/lib/utils/tree-kill.ts index d3e21c1f6..1852f84e9 100644 --- a/lib/utils/tree-kill.ts +++ b/lib/utils/tree-kill.ts @@ -1,81 +1,80 @@ import { execSync } from 'child_process'; export function treeKillSync(pid: number, signal?: string | number): void { + if (process.platform === 'win32') { + execSync('taskkill /pid ' + pid + ' /T /F'); + return; + } - if (process.platform === "win32") { - execSync('taskkill /pid ' + pid + ' /T /F'); - return; - } - - const childs = getAllChilds(pid); - - childs.forEach(function (pid) { - killPid(pid, signal); - }); - + const childs = getAllChilds(pid); + childs.forEach(function (pid) { killPid(pid, signal); - return + }); + + killPid(pid, signal); + return; } function getAllPid(): { - pid: number, - ppid: number + pid: number; + ppid: number; }[] { - const rows = execSync('ps -A -o pid,ppid') - .toString() - .trim() - .split('\n') - .slice(1); - - return rows.map(function (row) { - var parts = row.match(/\s*(\d+)\s*(\d+)/); - - if (parts === null) { - return null; - } - - return { - pid: Number(parts[1]), - ppid: Number(parts[2]) - }; - }).filter((input: null | undefined | T): input is T => { - return input != null; + const rows = execSync('ps -A -o pid,ppid') + .toString() + .trim() + .split('\n') + .slice(1); + + return rows + .map(function (row) { + var parts = row.match(/\s*(\d+)\s*(\d+)/); + + if (parts === null) { + return null; + } + + return { + pid: Number(parts[1]), + ppid: Number(parts[2]), + }; + }) + .filter((input: null | undefined | T): input is T => { + return input != null; }); } function getAllChilds(pid: number) { - const allpid = getAllPid(); - - let ppidHash: { - [key: number]: number[] - } = {}; + const allpid = getAllPid(); - let result: number[] = []; + let ppidHash: { + [key: number]: number[]; + } = {}; - allpid.forEach(function (item) { - ppidHash[item.ppid] = ppidHash[item.ppid] || []; - ppidHash[item.ppid].push(item.pid); - }); + let result: number[] = []; - const find = function (pid: number) { - ppidHash[pid] = ppidHash[pid] || []; - ppidHash[pid].forEach(function (childPid) { - result.push(childPid); - find(childPid); - }); - }; + allpid.forEach(function (item) { + ppidHash[item.ppid] = ppidHash[item.ppid] || []; + ppidHash[item.ppid].push(item.pid); + }); - find(pid); + const find = function (pid: number) { + ppidHash[pid] = ppidHash[pid] || []; + ppidHash[pid].forEach(function (childPid) { + result.push(childPid); + find(childPid); + }); + }; - return result; + find(pid); + return result; } function killPid(pid: number, signal?: string | number) { - try { - process.kill(pid, signal); - } catch (err) { - if (err.code !== 'ESRCH') { - throw err; - } + try { + process.kill(pid, signal); + } catch (err) { + if (err.code !== 'ESRCH') { + throw err; } -} \ No newline at end of file + } +}