aboutsummaryrefslogtreecommitdiffstats
path: root/node_modules/tree-kill/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/tree-kill/index.js')
-rwxr-xr-xnode_modules/tree-kill/index.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/node_modules/tree-kill/index.js b/node_modules/tree-kill/index.js
new file mode 100755
index 0000000..8df6a0f
--- /dev/null
+++ b/node_modules/tree-kill/index.js
@@ -0,0 +1,118 @@
+'use strict';
+
+var childProcess = require('child_process');
+var spawn = childProcess.spawn;
+var exec = childProcess.exec;
+
+module.exports = function (pid, signal, callback) {
+ if (typeof signal === 'function' && callback === undefined) {
+ callback = signal;
+ signal = undefined;
+ }
+
+ pid = parseInt(pid);
+ if (Number.isNaN(pid)) {
+ if (callback) {
+ return callback(new Error("pid must be a number"));
+ } else {
+ throw new Error("pid must be a number");
+ }
+ }
+
+ var tree = {};
+ var pidsToProcess = {};
+ tree[pid] = [];
+ pidsToProcess[pid] = 1;
+
+ switch (process.platform) {
+ case 'win32':
+ exec('taskkill /pid ' + pid + ' /T /F', callback);
+ break;
+ 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 {
+ throw err;
+ }
+ }
+ if (callback) {
+ return callback();
+ }
+}
+
+function killPid(pid, signal) {
+ try {
+ process.kill(parseInt(pid, 10), signal);
+ }
+ catch (err) {
+ if (err.code !== 'ESRCH') throw err;
+ }
+}
+
+function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) {
+ var ps = spawnChildProcessesList(parentPid);
+ var allData = '';
+ ps.stdout.on('data', function (data) {
+ var 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;
+ }
+
+ allData.match(/\d+/g).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);
+}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage