/usr/local/lib/node_modules/pm2/lib
NameSizeModeActions
API/-0755rm
binaries/-0755rm
God/-0755rm
templates/-0755rm
tools/-0755rm
API.js601540644editdlrm
Client.js204480644editdlrm
Common.js265320644editdlrm
completion.js68710644editdlrm
completion.sh11910644editdlrm
Configuration.js65490644editdlrm
Daemon.js129570644editdlrm
Event.js11230644editdlrm
God.js190040644editdlrm
HttpInterface.js23000644editdlrm
motd12490644editdlrm
ProcessContainer.js88160644editdlrm
ProcessContainerBun.js108190644editdlrm
ProcessContainerFork.js12800644editdlrm
ProcessContainerForkBun.js9870644editdlrm
ProcessUtils.js14230644editdlrm
TreeKill.js27910644editdlrm
Utility.js85130644editdlrm
VersionCheck.js10220644editdlrm
Watcher.js29780644editdlrm
Worker.js49790644editdlrm
Edit: /usr/local/lib/node_modules/pm2/lib/TreeKill.js (2791B)
'use strict'; // From https://raw.githubusercontent.com/pkrumins/node-tree-kill/master/index.js var childProcess = require('child_process'); var spawn = childProcess.spawn; var exec = childProcess.exec; module.exports = function (pid, signal, callback) { var tree = {}; var pidsToProcess = {}; tree[pid] = []; pidsToProcess[pid] = 1; switch (process.platform) { case 'win32': exec('taskkill /pid ' + pid + ' /T /F', { windowsHide: true }, callback); break; case 'freebsd': case 'darwin': buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { return spawn('pgrep', ['-P', parentPid]); }, function () { killAll(tree, signal, callback); }); break; // case 'sunos': // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () { // killAll(tree, signal, callback); // }); // break; default: // Linux buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]); }, function () { killAll(tree, signal, callback); }); break; } }; function killAll (tree, signal, callback) { var killed = {}; try { Object.keys(tree).forEach(function (pid) { tree[pid].forEach(function (pidpid) { if (!killed[pidpid]) { killPid(pidpid, signal); killed[pidpid] = 1; } }); if (!killed[pid]) { killPid(pid, signal); killed[pid] = 1; } }); } catch (err) { if (callback) { return callback(err); } else { console.error(err); } } if (callback) { return callback(); } } function killPid(pid, signal) { try { process.kill(parseInt(pid, 10), signal); } catch (err) { if (err.code !== 'ESRCH') console.error(err); } } function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) { var ps = spawnChildProcessesList(parentPid); var allData = ''; ps.on('error', function(err) { console.error(err); }); if (ps.stdout) { ps.stdout.on('data', function (data) { data = data.toString('ascii'); allData += data; }); } var onClose = function (code) { delete pidsToProcess[parentPid]; if (code !== 0) { // no more parent processes if (Object.keys(pidsToProcess).length == 0) { cb(); } return; } var pids = allData.match(/\d+/g) || []; if (pids.length === 0) return cb(); pids.forEach(function (pid) { pid = parseInt(pid, 10); tree[parentPid].push(pid); tree[pid] = []; pidsToProcess[pid] = 1; buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); }); }; ps.on('close', onClose); }