UNPKG

@nestjs/cli

Version:

Nest - modern, fast, powerful node.js web framework (@cli)

66 lines (65 loc) 1.66 kB
import { execSync, spawnSync } from 'child_process'; export function treeKillSync(pid, signal) { if (process.platform === 'win32') { execSync('taskkill /pid ' + pid + ' /T /F'); return; } const children = getAllChildren(pid); children.forEach(function (pid) { killPid(pid, signal); }); killPid(pid, signal); return; } function getAllPid() { const result = spawnSync('ps', ['-A', '-o', 'pid,ppid'], { encoding: 'utf-8', stdio: 'pipe', }); if (result.error || !result.stdout) { return []; } const rows = result.stdout.trim().split('\n').slice(1); return rows .map(function (row) { const parts = row.match(/\s*(\d+)\s*(\d+)/); if (parts === null) { return null; } return { pid: Number(parts[1]), ppid: Number(parts[2]), }; }) .filter((input) => { return input != null; }); } function getAllChildren(pid) { const allpid = getAllPid(); const ppidHash = {}; const result = []; allpid.forEach(function (item) { ppidHash[item.ppid] = ppidHash[item.ppid] || []; ppidHash[item.ppid].push(item.pid); }); const find = function (pid) { ppidHash[pid] = ppidHash[pid] || []; ppidHash[pid].forEach(function (childPid) { result.push(childPid); find(childPid); }); }; find(pid); return result; } function killPid(pid, signal) { try { process.kill(pid, signal); } catch (err) { if (err.code !== 'ESRCH') { throw err; } } }