---
name: is_cpp_app_running_windows
kind: function
lang: bash
domain: infra
version: "1.0.0"
purity: impure
signature: "is_cpp_app_running_windows(app_name: string) -> void"
description: "Comprueba si un ejecutable Windows esta corriendo via tasklist.exe desde WSL2. Exit 0 si el proceso existe, exit 1 si no."
tags: [cpp, windows, monitoring, wsl, tasklist, process, cpp-windows]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "bash/functions/infra/is_cpp_app_running_windows.sh"
params:
  - name: app_name
    desc: "Nombre del binario sin extension .exe (ej. registry_dashboard). Se le añade .exe internamente para el filtro de tasklist."
output: "Exit 0 con stdout 'RUNNING: PID=<pid> MEM=<mem>' si el proceso existe. Exit 1 con stdout 'NOT_RUNNING: <app_name>' si no. Exit 1 con stderr si tasklist.exe no esta disponible."
---

## Ejemplo

```bash
if is_cpp_app_running_windows "registry_dashboard"; then
    echo "Ya esta corriendo"
else
    launch_cpp_app_windows "registry_dashboard"
fi
```

Composicion tipica en pipelines de redeploy:

```bash
# Matar antes de copiar si esta vivo
if is_cpp_app_running_windows "$app"; then
    taskkill.exe /IM "${app}.exe" /F
fi
deploy_cpp_exe_to_windows "$app" "$app_dir"
launch_cpp_app_windows "$app"
```

## Comportamiento

El exit code es la API principal; stdout es informacion adjunta parseable por el caller:

| Situacion | Exit | Stdout |
|---|---|---|
| Proceso encontrado | 0 | `RUNNING: PID=<n> MEM=<n>K` |
| Proceso no encontrado | 1 | `NOT_RUNNING: <app_name>` |
| `tasklist.exe` no disponible | 1 | (stderr) `ERROR: tasklist.exe no encontrado` |
| `app_name` vacio | 1 | (stderr) `ERROR: uso: ...` |

El formato `RUNNING: PID=N MEM=...K` esta pensado para ser parseado por `cut -d= -f2` si el caller necesita el PID.

## Prerequisitos

- WSL2 con acceso a herramientas Windows (`/mnt/c/Windows/System32/tasklist.exe`).
- El proceso debe haber sido lanzado via `launch_cpp_app_windows` o cualquier otro mecanismo que cree un proceso Windows con el nombre del `.exe`.

## Notas

Util para componer con `launch_cpp_app_windows` y `deploy_cpp_exe_to_windows` en pipelines de redeploy desde WSL2. `deploy_cpp_exe_to_windows` ya incluye un `taskkill.exe` interno antes de copiar, pero esta funcion permite tomar la decision de matar/no matar de forma explicita en el caller.

Tasklist con `/NH /FO CSV` no emite header, por lo que la primera linea de salida con el nombre de imagen es directamente el primer proceso coincidente. Si hay multiples instancias del mismo `.exe`, se informa solo del primero (PID mas bajo en el listado del sistema).
