--- name: port_kill kind: function lang: bash domain: infra version: "1.0.0" purity: impure signature: "port_kill(port: int, signal: string) -> void" description: "Mata los procesos que escuchan en un puerto TCP dado. Idempotente: si no hay proceso en el puerto retorna exit 0. Hace un segundo intento con SIGKILL si el primer intento con signal no libera el puerto." tags: [port, kill, process, tcp, pendiente-usar] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: port desc: "Numero de puerto TCP (1-65535) cuyos procesos en estado LISTEN seran terminados." - name: signal desc: "Signal opcional para kill. Default TERM. Acepta KILL, INT, TERM, HUP o numerico (9, 15, ...). Si el proceso sobrevive, se reintenta automaticamente con KILL." output: "Imprime a stdout una linea por cada PID matado (KILLED pid=X signal=Y port=Z) o NO_PROCESS si el puerto ya estaba libre. Errores a stderr. Exit codes: 0=OK, 2=puerto invalido, 3=puerto sigue ocupado tras SIGKILL, 4=permiso denegado, 5=ni lsof ni fuser disponibles." tested: false tests: [] test_file_path: "" file_path: "bash/functions/infra/port_kill.sh" --- ## Ejemplo ```bash source bash/functions/infra/port_kill.sh # Matar proceso en puerto 8080 con SIGTERM (default) port_kill 8080 # Matar proceso en puerto 3000 con SIGKILL directo port_kill 3000 KILL ``` ## Notas Idempotente: si ningun proceso escucha en el puerto, imprime `NO_PROCESS port=` y retorna 0 sin error. Preferencia de herramienta: usa `lsof -ti tcp: -sTCP:LISTEN` si esta disponible; fallback a `fuser -n tcp `. Si ninguno esta instalado, retorna exit 5. Logica de reintento: tras enviar la signal inicial espera 2 segundos. Si el puerto sigue ocupado y la signal no era KILL/9, realiza un segundo intento con SIGKILL. Si tras ese segundo intento el puerto sigue bloqueado, retorna exit 3. Permisos: si los PIDs pertenecen a root y el invocador no tiene privilegios, `kill` fallara y se reporta `PERMISSION_DENIED pid=` a stderr con exit 4. Ejecutar con sudo si es necesario.