# monitor_estado_watchdog.ps1 — Asegura que el Monitor de estado esta corriendo (una instancia). # # Uso: # powershell -ExecutionPolicy Bypass -File monitor_estado_watchdog.ps1 -Once # lanza si no corre # powershell -ExecutionPolicy Bypass -File monitor_estado_watchdog.ps1 -Stop # detiene el monitor # # Lo llaman: la tarea programada al iniciar sesion y el plugin global de OpenCode # (monitor-estado-bootstrap.ts). El propio monitor tiene ademas un lock (lock.py), # asi que aunque ambos coincidan no habra dos instancias. param( [switch]$Once, [switch]$Stop ) $ErrorActionPreference = 'SilentlyContinue' $ScriptsDir = $PSScriptRoot $Repo = Split-Path -Parent $ScriptsDir $Script = Join-Path $ScriptsDir 'monitor_estado.py' $LogDir = Join-Path $Repo 'estado\monitor' $OutLog = Join-Path $LogDir 'monitor_estado.out.log' $ErrLog = Join-Path $LogDir 'monitor_estado.err.log' $LockFile = Join-Path $LogDir '.lock' if (-not (Test-Path $LogDir)) { New-Item -ItemType Directory -Path $LogDir -Force | Out-Null } function Get-MonitorProcesos { Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'monitor_estado\.py\s+daemon' } } if ($Stop) { $procs = Get-MonitorProcesos foreach ($p in $procs) { Stop-Process -Id $p.ProcessId -Force } Remove-Item -LiteralPath $LockFile -Force -ErrorAction SilentlyContinue Write-Output "[monitor_estado] Detenido ($($procs.Count) proceso(s))." exit 0 } $procs = Get-MonitorProcesos if ($procs) { Write-Output "[monitor_estado] Ya en marcha ($($procs.Count) proceso). Nada que hacer." exit 0 } # Lanzar el daemon en segundo plano, oculto y con log. $python = (Get-Command python).Source if (-not $python) { Write-Output "[monitor_estado] Python no encontrado en PATH."; exit 1 } Start-Process -FilePath $python ` -ArgumentList @('-u', $Script, 'daemon') ` -WorkingDirectory $Repo ` -WindowStyle Hidden ` -RedirectStandardOutput $OutLog ` -RedirectStandardError $ErrLog Write-Output "[monitor_estado] Daemon lanzado (log: $OutLog)." exit 0