Volver a la wiki

Decisión: Flags de CreateProcess en Windows para el watchdog post-swap (DETACHED_PROCESS vs CREATE_NO_WINDOW)

Contexto

El watchdog (proceso hijo desacoplado) que monitorea el auto-update del Agente debe:

  1. Lanzarse desde el Agente que está a punto de reemplazarse.
  2. Sobrevivir al padre (que hace os._exit(0) inmediatamente).
  3. Ejecutar un script PowerShell que escribe logs y realiza healthchecks (GET /health).

En Windows, subprocess.Popen(creationflags=...) requiere una combinación de flags que garantice:


Alternativas consideradas

❌ Opción 1: DETACHED_PROCESS | CREATE_NO_WINDOW (hasta 2.13.2)

creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NO_WINDOW

Razonamiento original:

Problema descubierto (incidentes 03-07 y 05-07-2026):


✅ Opción 2: CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW + stdin/stdout/stderr=DEVNULL (2.13.3+)

creationflags=subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NO_WINDOW,
stdin=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,

Razonamiento revisado:

Ventajas:

Por qué no usar explícitamente DETACHED_PROCESS:


Decisión

Adoptar Opción 2: Reemplazar DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW por CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW + handles explícitos en DEVNULL.

Reasoning

  1. Correctness: Elimina el conflicto de flags que mataba silenciosamente el watchdog.
  2. Simplicity: Menos flags = menos superficies de ambigüedad en Windows API.
  3. Empirical verification: Probado en laboratorio; el nuevo setup permite que el script corra completamente.
  4. Backwards compatibility: No afecta el resto del código (solo el lanzamiento del watchdog).

Implementation


Impacto

En el Agent

En la flota


Véase también

Subir