97 lines
2.4 KiB
TypeScript
97 lines
2.4 KiB
TypeScript
import { execSync } from 'child_process'
|
|
|
|
/**
|
|
* Kill process on port util
|
|
* @param port port number to kill
|
|
*/
|
|
export function killProcessesOnPort(port: number): void {
|
|
try {
|
|
console.log(`Killing processes on port ${port}...`)
|
|
if (process.platform === 'win32') {
|
|
killProcessesOnWindowsPort(port)
|
|
} else {
|
|
killProcessesOnUnixPort(port)
|
|
}
|
|
} catch (error) {
|
|
console.error(
|
|
`Failed to kill process(es) on port ${port}: ${(error as Error).message}`
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Kill process on port - Windows
|
|
* @param port
|
|
* @returns
|
|
*/
|
|
function killProcessesOnWindowsPort(port: number): void {
|
|
let result: string
|
|
try {
|
|
result = execSync(`netstat -ano | findstr :${port}`).toString()
|
|
} catch (error) {
|
|
console.log(`No processes found on port ${port}.`)
|
|
return
|
|
}
|
|
|
|
const lines = result.split('\n').filter(Boolean)
|
|
|
|
if (lines.length === 0) {
|
|
console.log(`No processes found on port ${port}.`)
|
|
return
|
|
}
|
|
|
|
const pids = lines
|
|
.map((line) => {
|
|
const parts = line.trim().split(/\s+/)
|
|
return parts[parts.length - 1]
|
|
})
|
|
.filter((pid): pid is string => Boolean(pid) && !isNaN(Number(pid)))
|
|
|
|
if (pids.length === 0) {
|
|
console.log(`No valid PIDs found for port ${port}.`)
|
|
return
|
|
}
|
|
const uniquePids = Array.from(new Set(pids))
|
|
console.log('uniquePids', uniquePids)
|
|
|
|
uniquePids.forEach((pid) => {
|
|
try {
|
|
execSync(`taskkill /PID ${pid} /F`)
|
|
console.log(
|
|
`Process with PID ${pid} on port ${port} has been terminated.`
|
|
)
|
|
} catch (error) {
|
|
console.error(
|
|
`Failed to kill process with PID ${pid}: ${(error as Error).message}`
|
|
)
|
|
}
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Kill process on port - Unix
|
|
* @param port
|
|
* @returns
|
|
*/
|
|
function killProcessesOnUnixPort(port: number): void {
|
|
let pids: string[]
|
|
|
|
try {
|
|
pids = execSync(`lsof -ti tcp:${port}`)
|
|
.toString()
|
|
.trim()
|
|
.split('\n')
|
|
.filter(Boolean)
|
|
} catch (error) {
|
|
if ((error as { status?: number }).status === 1) {
|
|
console.log(`No processes found on port ${port}.`)
|
|
return
|
|
}
|
|
throw error // Re-throw if it's not the "no processes found" error
|
|
}
|
|
|
|
pids.forEach((pid) => {
|
|
process.kill(parseInt(pid), 'SIGTERM')
|
|
console.log(`Process with PID ${pid} on port ${port} has been terminated.`)
|
|
})
|
|
} |