| |
| |
| |
| |
|
|
| import { exec } from 'child_process'; |
| import { promisify } from 'util'; |
|
|
| const execAsync = promisify(exec); |
|
|
| const SERVER_PORT = process.env.TEST_SERVER_PORT || 3108; |
| const UI_PORT = process.env.TEST_PORT || 3107; |
| |
| |
| const USE_EXTERNAL_SERVER = process.env.TEST_USE_EXTERNAL_BACKEND === 'true'; |
| console.log(`[KillTestServers] SERVER_PORT ${SERVER_PORT}`); |
| console.log(`[KillTestServers] UI_PORT ${UI_PORT}`); |
| async function killProcessOnPort(port) { |
| try { |
| const hasLsof = await execAsync('command -v lsof').then( |
| () => true, |
| () => false |
| ); |
|
|
| if (hasLsof) { |
| const { stdout } = await execAsync(`lsof -ti:${port}`); |
| const pids = stdout.trim().split('\n').filter(Boolean); |
|
|
| if (pids.length > 0) { |
| console.log(`[KillTestServers] Found process(es) on port ${port}: ${pids.join(', ')}`); |
| for (const pid of pids) { |
| try { |
| await execAsync(`kill -9 ${pid}`); |
| console.log(`[KillTestServers] Killed process ${pid}`); |
| } catch (_error) { |
| |
| } |
| } |
| await new Promise((resolve) => setTimeout(resolve, 500)); |
| } |
| return; |
| } |
|
|
| const hasFuser = await execAsync('command -v fuser').then( |
| () => true, |
| () => false |
| ); |
| if (hasFuser) { |
| await execAsync(`fuser -k -9 ${port}/tcp`).catch(() => undefined); |
| await new Promise((resolve) => setTimeout(resolve, 500)); |
| return; |
| } |
| } catch (_error) { |
| |
| } |
| } |
|
|
| async function main() { |
| console.log('[KillTestServers] Checking for existing test servers...'); |
| if (!USE_EXTERNAL_SERVER) { |
| await killProcessOnPort(Number(SERVER_PORT)); |
| } |
| await killProcessOnPort(Number(UI_PORT)); |
| console.log('[KillTestServers] Done'); |
| } |
|
|
| main().catch(console.error); |
|
|