diff options
Diffstat (limited to 'node_modules/tree-kill')
| -rw-r--r-- | node_modules/tree-kill/LICENSE | 21 | ||||
| -rw-r--r-- | node_modules/tree-kill/README.md | 89 | ||||
| -rwxr-xr-x | node_modules/tree-kill/cli.js | 14 | ||||
| -rw-r--r-- | node_modules/tree-kill/index.d.ts | 13 | ||||
| -rwxr-xr-x | node_modules/tree-kill/index.js | 118 | ||||
| -rw-r--r-- | node_modules/tree-kill/package.json | 51 |
6 files changed, 306 insertions, 0 deletions
diff --git a/node_modules/tree-kill/LICENSE b/node_modules/tree-kill/LICENSE new file mode 100644 index 0000000..aa86c2d --- /dev/null +++ b/node_modules/tree-kill/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Peter Krumins + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/tree-kill/README.md b/node_modules/tree-kill/README.md new file mode 100644 index 0000000..59a00ea --- /dev/null +++ b/node_modules/tree-kill/README.md @@ -0,0 +1,89 @@ +Tree Kill +========= + +Kill all processes in the process tree, including the root process. + +Examples +======= + +Kill all the descendent processes of the process with pid `1`, including the process with pid `1` itself: +```js +var kill = require('tree-kill'); +kill(1); +``` + +Send a signal other than SIGTERM.: +```js +var kill = require('tree-kill'); +kill(1, 'SIGKILL'); +``` + +Run a callback when done killing the processes. Passes an error argument if there was an error. +```js +var kill = require('tree-kill'); +kill(1, 'SIGKILL', function(err) { + // Do things +}); +``` + +You can also install tree-kill globally and use it as a command: +```sh +tree-kill 1 # sends SIGTERM to process 1 and its descendents +tree-kill 1 SIGTERM # same +tree-kill 1 SIGKILL # sends KILL instead of TERMINATE +``` + +Methods +======= + +## require('tree-kill')(pid, [signal], [callback]); + +Sends signal `signal` to all children processes of the process with pid `pid`, including `pid`. Signal defaults to `SIGTERM`. + +For Linux, this uses `ps -o pid --no-headers --ppid PID` to find the parent pids of `PID`. + +For Darwin/OSX, this uses `pgrep -P PID` to find the parent pids of `PID`. + +For Windows, this uses `'taskkill /pid PID /T /F'` to kill the process tree. Note that on Windows, sending the different kinds of POSIX signals is not possible. + +Install +======= + +With [npm](https://npmjs.org) do: + +``` +npm install tree-kill +``` + +License +======= + +MIT + +Changelog +========= + + +## [1.2.2] - 2019-12-11 +### Changed +- security fix: sanitize `pid` parameter to fix arbitrary code execution vulnerability + +## [1.2.1] - 2018-11-05 +### Changed +- added missing LICENSE file +- updated TypeScript definitions + +## [1.2.0] - 2017-09-19 +### Added +- TypeScript definitions +### Changed +- `kill(pid, callback)` works. Before you had to use `kill(pid, signal, callback)` + +## [1.1.0] - 2016-05-13 +### Added +- A `tree-kill` CLI + +## [1.0.0] - 2015-09-17 +### Added +- optional callback +- Darwin support diff --git a/node_modules/tree-kill/cli.js b/node_modules/tree-kill/cli.js new file mode 100755 index 0000000..1acb815 --- /dev/null +++ b/node_modules/tree-kill/cli.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node +kill = require('.') +try { + kill(process.argv[2], process.argv[3], function(err){ + if (err) { + console.log(err.message) + process.exit(1) + } + }) +} +catch (err) { + console.log(err.message) + process.exit(1) +} diff --git a/node_modules/tree-kill/index.d.ts b/node_modules/tree-kill/index.d.ts new file mode 100644 index 0000000..e0b1302 --- /dev/null +++ b/node_modules/tree-kill/index.d.ts @@ -0,0 +1,13 @@ +/** + * Kills process identified by `pid` and all its children + * + * @param pid + * @param signal 'SIGTERM' by default + * @param callback + */ +declare function treeKill(pid: number, callback?: (error?: Error) => void): void; +declare function treeKill(pid: number, signal?: string | number, callback?: (error?: Error) => void): void; + +declare namespace treeKill {} + +export = treeKill; 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); +} diff --git a/node_modules/tree-kill/package.json b/node_modules/tree-kill/package.json new file mode 100644 index 0000000..fa37804 --- /dev/null +++ b/node_modules/tree-kill/package.json @@ -0,0 +1,51 @@ +{ + "name": "tree-kill", + "version": "1.2.2", + "description": "kill trees of processes", + "main": "index.js", + "types": "index.d.ts", + "bin": { + "tree-kill": "cli.js" + }, + "scripts": { + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git://github.com/pkrumins/node-tree-kill.git" + }, + "homepage": "https://github.com/pkrumins/node-tree-kill", + "keywords": [ + "tree", + "trees", + "process", + "processes", + "kill", + "signal" + ], + "author": { + "name": "Peteris Krumins", + "email": "peteris.krumins@gmail.com", + "url": "http://www.catonmat.net" + }, + "contributors": [ + { + "name": "Todd Wolfson", + "email": "todd@twolfson.com", + "url": "http://twolfson.com/" + }, + { + "name": "William Hilton", + "email": "wmhilton@gmail.com", + "url": "http://wmhilton.com/" + }, + { + "name": "FabrÃcio Matté", + "url": "http://ultcombo.js.org/" + } + ], + "license": "MIT", + "devDependencies": { + "mocha": "^2.2.5" + } +} |
