8742cb25be
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.6 KiB
3.6 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cdp_close | function | go | browser | 1.2.0 | impure | func CdpClose(c *CDPConn, pid int) error | Cierra la conexion WebSocket CDP y opcionalmente mata el proceso Chrome por PID. En Linux nativo mata el grupo de proceso completo (pid == pgid cuando ChromeLaunch seteo Setpgid=true), lo que incluye zygote, gpu-process y renderers. Si c es nil, solo mata el proceso. Si pid <= 0, solo cierra la conexion. Siempre intenta ambas operaciones aunque una falle. Wrappers nombrados: CdpDisconnect(c) solo cierra el WebSocket; CdpQuit(c, pid) cierra y mata Chrome. |
|
false | error_go_core |
|
|
error si falla la desconexion o el cierre del proceso; nil si todo OK | true |
|
functions/browser/cdp_close_test.go | functions/browser/cdp_close.go |
Ejemplo
pid, _ := ChromeLaunch(ChromeLaunchOpts{Port: 9222, Headless: true})
conn, _ := CdpConnect(9222)
defer CdpClose(conn, pid) // cierra WebSocket y mata grupo Chrome completo
// O por separado:
defer CdpClose(conn, 0) // solo cierra WebSocket
defer CdpClose(nil, pid) // solo mata Chrome (y su grupo en Linux)
Cuando usarla
Usar siempre en defer después de ChromeLaunch para garantizar cleanup del proceso Chrome y del WebSocket CDP. En Linux nativo mata el árbol completo de procesos (zygote, gpu, renderers) evitando procesos zombie.
Elige el wrapper según la intención (más legible que el pid mágico):
| Quiero... | Usa | Equivale a |
|---|---|---|
| Soltar la sesión, dejar Chrome vivo (navegador diario en 9222) | CdpDisconnect(c) |
CdpClose(c, 0) |
| Apagar el Chrome que yo lancé | CdpQuit(c, pid) |
CdpClose(c, pid) |
| Control fino (decidir pid en runtime) | CdpClose(c, pid) |
— |
Gotchas
- Kill por grupo (Linux nativo): usa
syscall.Kill(-pid, SIGKILL)que envía la señal a todos los procesos del grupo. Funciona porqueChromeLaunchseteaSetpgid: trueen Linux, haciendo quepid == pgid. En WSL+chrome.exe el Setpgid no se aplica, por lo que el fallback aos.FindProcess(pid).Kill()maneja ese caso. - Fallback automático: si el kill de grupo falla (proceso ya terminado, PID no encontrado, o es WSL+exe), intenta matar solo el proceso raiz. En ambos casos el error no es fatal si el proceso ya no existe.
- Doble cierre seguro: marca
c.closed = truepara evitar doble cierre del WebSocket. El segundoCdpClosecon la misma conexión es un no-op en el lado WebSocket. - Primer error: si tanto el cierre WebSocket como el kill fallan, retorna el error del WebSocket (el primero en ejecutarse). El kill siempre se intenta aunque el WebSocket falle.
Notas
Usar en defer para garantizar cleanup. Si tanto la conexion como el proceso son invalidos, el error retornado corresponde al primero que fallo.
Capability growth log
- v1.2.0 (2026-06-06) — añade wrappers nombrados CdpDisconnect(c) (solo WebSocket) y CdpQuit(c, pid) (WebSocket + mata Chrome) para desambiguar el
pidmágico; CdpClose sin cambios de comportamiento. - v1.1.0 (2026-06-05) — Linux-native kill: usa syscall.Kill(-pid, SIGKILL) para matar grupo completo (zygote, gpu, renderers), con fallback a os.FindProcess para WSL+exe o proceso ya terminado