From fad113e2be11ffc7c716f23bbc3147b21928e0dc Mon Sep 17 00:00:00 2001 From: Mark Repka Date: Tue, 6 Jun 2023 10:22:28 -0400 Subject: [PATCH 1/5] Add signal parameter --- cli.js | 3 ++- index.js | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cli.js b/cli.js index 74abc7d..f743361 100755 --- a/cli.js +++ b/cli.js @@ -5,6 +5,7 @@ const kill = require('./') const args = require('get-them-args')(process.argv.slice(2)) const verbose = args.verbose || false +const signal = args.signal || '9' let port = args.port ? args.port.toString().split(',') : args.unknown const method = args.method || 'tcp' @@ -13,7 +14,7 @@ if (!Array.isArray(port)) { } Promise.all(port.map(current => { - return kill(current, method) + return kill(current, method, signal) .then((result) => { console.log(`Process on port ${current} killed`) verbose && console.log(result) diff --git a/index.js b/index.js index 584168b..23629ce 100644 --- a/index.js +++ b/index.js @@ -2,13 +2,18 @@ const sh = require('shell-exec') -module.exports = function (port, method = 'tcp') { +module.exports = function (port, method = 'tcp', signal = '9') { port = Number.parseInt(port) + signal = Number.parseInt(signal) if (!port) { return Promise.reject(new Error('Invalid port number provided')) } + if (!signal) { + return Promise.reject(new Error('Invalid signal number provided')) + } + if (process.platform === 'win32') { return sh('netstat -nao') .then(res => { @@ -40,7 +45,7 @@ module.exports = function (port, method = 'tcp') { if (!existProccess) return Promise.reject(new Error('No process running on port')) return sh( - `lsof -i ${method === 'udp' ? 'udp' : 'tcp'}:${port} | grep ${method === 'udp' ? 'UDP' : 'LISTEN'} | awk '{print $2}' | xargs kill -9` + `lsof -i ${method === 'udp' ? 'udp' : 'tcp'}:${port} | grep ${method === 'udp' ? 'UDP' : 'LISTEN'} | awk '{print $2}' | xargs kill -${signal}` ) }) } From 3b945b0fb663c9b6d1d2b68ddbfab04ab1a032c4 Mon Sep 17 00:00:00 2001 From: Mark Repka Date: Tue, 6 Jun 2023 10:46:05 -0400 Subject: [PATCH 2/5] More verbose log message --- cli.js | 4 ++-- index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli.js b/cli.js index f743361..7f4015f 100755 --- a/cli.js +++ b/cli.js @@ -5,7 +5,7 @@ const kill = require('./') const args = require('get-them-args')(process.argv.slice(2)) const verbose = args.verbose || false -const signal = args.signal || '9' +const signal = args.signal || '15' let port = args.port ? args.port.toString().split(',') : args.unknown const method = args.method || 'tcp' @@ -16,7 +16,7 @@ if (!Array.isArray(port)) { Promise.all(port.map(current => { return kill(current, method, signal) .then((result) => { - console.log(`Process on port ${current} killed`) + console.log(`Process on port ${current}:${method} killed using signal ${signal}`) verbose && console.log(result) }) .catch((error) => { diff --git a/index.js b/index.js index 23629ce..01bb043 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ const sh = require('shell-exec') -module.exports = function (port, method = 'tcp', signal = '9') { +module.exports = function (port, method = 'tcp', signal = '15') { port = Number.parseInt(port) signal = Number.parseInt(signal) From d209e0d9cdf591bf542404d75a5b272c055e2e46 Mon Sep 17 00:00:00 2001 From: Mark Repka Date: Tue, 6 Jun 2023 12:05:41 -0400 Subject: [PATCH 3/5] Cleanup for PR --- README.md | 3 ++- cli.js | 7 ++++--- index.js | 21 +++++++++++++++++---- test.js | 6 +++++- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 91a2a48..2c70eea 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,6 @@ const server = http.createServer((req, res) => { server.listen(port, () => { setTimeout(() => { - // Currently you can kill ports running on TCP or UDP protocols kill(port, 'tcp') .then(console.log) @@ -108,6 +107,8 @@ $ kill-port --port 8080 $ kill-port 9000 # OR you can use UDP $ kill-port 9000 --method udp +# OR you can use SIGTERM +$ kill-port --signal SIGTERM 9000 ``` You can also kill multiple ports: diff --git a/cli.js b/cli.js index 7f4015f..1406cbb 100755 --- a/cli.js +++ b/cli.js @@ -5,10 +5,11 @@ const kill = require('./') const args = require('get-them-args')(process.argv.slice(2)) const verbose = args.verbose || false -const signal = args.signal || '15' -let port = args.port ? args.port.toString().split(',') : args.unknown +const signal = args.signal || 'SIGKILL' const method = args.method || 'tcp' +let port = args.port ? args.port.toString().split(',') : args.unknown + if (!Array.isArray(port)) { port = [port] } @@ -16,7 +17,7 @@ if (!Array.isArray(port)) { Promise.all(port.map(current => { return kill(current, method, signal) .then((result) => { - console.log(`Process on port ${current}:${method} killed using signal ${signal}`) + console.log(`Process on ${method} port ${current} killed using signal ${signal}`) verbose && console.log(result) }) .catch((error) => { diff --git a/index.js b/index.js index 01bb043..0b01c1e 100644 --- a/index.js +++ b/index.js @@ -2,16 +2,16 @@ const sh = require('shell-exec') -module.exports = function (port, method = 'tcp', signal = '15') { +module.exports = function (port, method = 'tcp', signal = 'SIGKILL') { port = Number.parseInt(port) - signal = Number.parseInt(signal) + signal = mapSignalToNumber(signal) if (!port) { return Promise.reject(new Error('Invalid port number provided')) } - if (!signal) { - return Promise.reject(new Error('Invalid signal number provided')) + if (!signal) { + return Promise.reject(new Error('Invalid signal name provided')) } if (process.platform === 'win32') { @@ -49,3 +49,16 @@ module.exports = function (port, method = 'tcp', signal = '15') { ) }) } + +function mapSignalToNumber(signal) { + const signals = { + SIGHUP: 1, + SIGINT: 2, + SIGQUIT: 3, + SIGABRT: 6, + SIGKILL: 9, + SIGTERM: 15 + } + + return signals[signal] +} diff --git a/test.js b/test.js index 8df46d8..da6cff9 100644 --- a/test.js +++ b/test.js @@ -7,7 +7,11 @@ describe('kill-port', () => { }) test('should throw if no port is provided', () => { - expect(kill()).rejects.toThrow() + expect(kill()).rejects.toThrow('Invalid port number provided') + }) + + test('should throw if invalid signal is provided', () => { + expect(kill(9999, 'tcp', 'BADSIG')).rejects.toThrow('Invalid signal name provided') }) test('should throw if no process running on given port', () => { From d221a53196f3881b668575b56e7dc0aafd50ef8e Mon Sep 17 00:00:00 2001 From: Mark Repka Date: Tue, 6 Jun 2023 12:12:43 -0400 Subject: [PATCH 4/5] Fix whitespace --- index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 0b01c1e..f0fb167 100644 --- a/index.js +++ b/index.js @@ -51,14 +51,14 @@ module.exports = function (port, method = 'tcp', signal = 'SIGKILL') { } function mapSignalToNumber(signal) { - const signals = { + const signals = { SIGHUP: 1, SIGINT: 2, SIGQUIT: 3, SIGABRT: 6, - SIGKILL: 9, + SIGKILL: 9, SIGTERM: 15 - } + } - return signals[signal] + return signals[signal] } From 95636f09f032b195fd63fcaf4a6a0fa148f59188 Mon Sep 17 00:00:00 2001 From: Mark Repka Date: Tue, 6 Jun 2023 12:19:04 -0400 Subject: [PATCH 5/5] Match formatting --- index.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index f0fb167..0274635 100644 --- a/index.js +++ b/index.js @@ -51,14 +51,14 @@ module.exports = function (port, method = 'tcp', signal = 'SIGKILL') { } function mapSignalToNumber(signal) { - const signals = { - SIGHUP: 1, - SIGINT: 2, - SIGQUIT: 3, - SIGABRT: 6, - SIGKILL: 9, - SIGTERM: 15 - } + const signals = { + SIGHUP: 1, + SIGINT: 2, + SIGQUIT: 3, + SIGABRT: 6, + SIGKILL: 9, + SIGTERM: 15 + } - return signals[signal] + return signals[signal] }