재부팅 뒤 워치독이 5분마다 콘솔 창에 실패만 뿌리던 문제의 원인 세 가지를 고친다. - 워치독이 DB 다운을 감지하고 직접 복구한다. postgres(vignette-dev-db) 기동은 boot 담당이라 start-public-runtime.ps1 재호출로는 절대 복구되지 않았고, 그 결과 워치독은 고칠 수 없는 대상에 start를 무한 재시도하며 실패만 기록했다. db를 health check 항목에 넣고, 재시작 전에 컨테이너를 되살리며, 복구 실패 시에는 runtime 재시작을 시도하지 않고 종료한다. - 작업 액션을 wscript 런처(watch-public-runtime-task.vbs) 경유로 등록한다. powershell.exe를 직접 등록하면 -WindowStyle Hidden이어도 conhost 창이 매 실행 번쩍이고, 5분 주기에서는 그것이 곧 화면을 가리는 창이 된다. 런처는 pin 인자를 해석하지 않고 전달만 하며 provenance 검증은 기존대로 watchdog이 수행한다. - boot이 web preview 상태를 보고 -SkipWebRestart를 조건부로 붙인다. 무조건 스킵하면 재부팅 직후처럼 vite가 죽은 상태에서 boot 경로로는 web이 영영 복구되지 않았다. hidden trigger는 액션이 wscript 런처를 거치는지 함께 검증하도록 맞췄다.
45 lines
1.6 KiB
Text
45 lines
1.6 KiB
Text
' VignettePublicRuntimeWatchdog 작업 스케줄러 액션용 숨김 런처.
|
|
'
|
|
' 작업 스케줄러가 powershell.exe 를 직접 실행하면 -WindowStyle Hidden 이어도 conhost
|
|
' 콘솔 창이 실행 순간 번쩍인다. 워치독은 5분 주기라 그 번쩍임이 계속 화면을 가린다
|
|
' (2026-08-08/09/12 세 번 반복된 증상). wscript 로 Run(cmd, 0) 하면 창이 아예 생성되지
|
|
' 않는다. GlassDeck scripts\sync-ai-auth-hidden.vbs 와 동일 패턴이다.
|
|
'
|
|
' 이 래퍼는 pin 인자를 해석하지 않는다. 등록된 인자를 그대로 전달만 하고, provenance
|
|
' 검증(detached HEAD / clean tree / SHA pin)은 watch-public-runtime.ps1 이 수행한다.
|
|
' 경로를 하드코딩하지 않으므로 stable source root 가 바뀌어도 이 파일은 그대로 쓴다.
|
|
Option Explicit
|
|
|
|
Dim objShell, args, i, arg, cmd, exitCode, dryRun
|
|
|
|
Set args = WScript.Arguments
|
|
If args.Count = 0 Then
|
|
WScript.Echo "usage: watch-public-runtime-task.vbs -File <watch-public-runtime.ps1> -StableSourceRoot <root> ..."
|
|
WScript.Quit 2
|
|
End If
|
|
|
|
If LCase(args(0)) = "syntax-only" Then
|
|
WScript.Quit 0
|
|
End If
|
|
|
|
dryRun = False
|
|
cmd = "powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden"
|
|
For i = 0 To args.Count - 1
|
|
arg = args(i)
|
|
If i = 0 And LCase(arg) = "print-command" Then
|
|
dryRun = True
|
|
ElseIf InStr(arg, " ") > 0 Then
|
|
cmd = cmd & " """ & arg & """"
|
|
Else
|
|
cmd = cmd & " " & arg
|
|
End If
|
|
Next
|
|
|
|
If dryRun Then
|
|
WScript.Echo cmd
|
|
WScript.Quit 0
|
|
End If
|
|
|
|
Set objShell = CreateObject("WScript.Shell")
|
|
exitCode = objShell.Run(cmd, 0, True)
|
|
WScript.Quit exitCode
|