V VibeCoding 365
목록으로 Windows Terminal Flood

바이브코딩

윈도우 터미널 폭주 원인 및 해결 방법 | OpenConsole과 에이전트 CLI

OpenConsole·Windows Terminal 창이 수백 개씩 뜨는 이유와, 데몬·훅·업데이터·시작 바로가기까지 끊는 방법

윈도우 터미널 폭주 원인 및 해결 방법 | OpenConsole과 에이전트 CLI

터미널 폭주는 Windows에서 OpenConsole.exe나 Windows Terminal 창이 수십, 수백 개씩 연달아 뜨는 상태를 말한다. 작업표시줄이 아이콘으로 가득 차고, 마우스로 닫아도 새 창이 다시 생기며, 심하면 화면을 거의 쓸 수 없게 된다.

바이브 코딩 환경에서는 이 현상이 더 자주 보인다. 로컬 AI 에이전트, 터미널 데몬, Cursor CLI, 훅 스크립트, 시작 프로그램 바로가기가 한 PC 위에서 겹치기 때문이다. 2026년 10월 23일 기준으로 공식 문서와 Cursor 포럼, 터미널 데몬 쪽 커밋을 교차해 원인을 정리했다.

한 가지 앱만의 문제는 아니다. Orca 같은 터미널 데몬이 대표 사례로 보이지만, 에이전트 훅의 .sh 연결, cursor-agent 업데이터 대기 프로세스, 시작 폴더 .lnk 재실행처럼 숨기지 않은 콘솔 생성이 반복되면 같은 증상이 난다.

터미널 폭주가 뭔지

터미널 폭주는 “콘솔이 하나 더 열린다” 수준이 아니다. 같은 계열의 콘솔 프로세스가 짧은 간격으로 계속 생성되는 상태다. 화면에는 Windows Terminal 창이 쌓이거나, 작업 관리자에는 WindowsTerminal.exe와 OpenConsole.exe 개수가 빠르게 늘어난다.

정상 사용에서는 새 셸이 기존 창의 탭으로 붙거나, 백그라운드 자식 프로세스가 보이지 않는 콘솔로 돈다. 폭주 때는 그 두 조건이 깨진다. 새 인스턴스가 매번 새 창으로 붙고, 자식 프로세스에 숨김 플래그가 없어 기본 터미널 앱이 매번 화면을 연다.

터미널 폭주 정상과 폭주 비교
그림 1. 정상은 창 하나와 탭 위주이고, 폭주는 OpenConsole과 작업표시줄이 한꺼번에 늘어난다.
핵심 포인트: 폭주의 본질은 “터미널 앱이 고장 났다”보다 누가 CreateProcess로 콘솔 자식을 반복 생성하는지에 가깝다. Windows Terminal은 그 자식을 보이게 만드는 마지막 층이다.

지금 당장 알아둘 것

증상만 보면 원인 후보를 좁히기 쉽다.

눈에 보이는 신호자주 같이 뜨는 프로세스먼저 의볼 곳
창이 수 초마다 깜빡임OpenConsole.exe, WindowsTerminal.exe터미널 데몬, cursor-agent 업데이터 대기
Git Bash 창이 편집마다 증가bash.exe, mintty 계열Cursor Hooks의 .sh 경로
재부팅 직후 다시 시작데몬, 에이전트, 런너Startup 폴더 .lnk, Run 키
에이전트를 죽여도 계속 뜸데몬·호스트만 생존daemon-host, ACP 호스트

기본 터미널 앱이 Windows Terminal이면, 숨기지 않은 콘솔 자식은 대개 Windows Terminal 창으로 보인다. 기본값이 예전 Console Host면 conhost 창으로 보일 수 있다. Microsoft 문서에 따르면 기본 터미널 앱 설정은 Windows 11과 일부 Windows 10 22H2 이후에서 쓸 수 있다.

에이전트 창만 닫고 끝내면 안 되는 경우가 많다. 데몬이나 업데이터 대기 cmd가 살아 있으면 콘솔이 다시 열린다.

Windows가 콘솔을 띄우는 방식

Microsoft의 콘솔 생태계 문서에서 역할은 네 층으로 나뉜다. 클라이언트(cmd, pwsh, bash 같은 문자 모드 앱), 장치(ConDrv), 서버(콘솔 API를 해석하는 쪽), 터미널(화면과 입력).

전통 모드에서는 문자 모드 앱이 뜰 때 OS가 콘솔 호스트를 자동으로 붙인다. 지금 권장되는 ConPTY(의사 콘솔) 모드에서는 호스트 앱이 먼저 파이프와 CreatePseudoConsole으로 의사 콘솔을 만든 뒤, CreateProcess로 자식을 붙인다. 의사 콘솔 문서가 이 순서를 분명히 적는다.

이름역할사용자가 보는 것
conhost.exeWindows에 들어 있는 콘솔 서버예전 콘솔 창, 또는 ConPTY 서버
OpenConsole.exeTerminal 패키지에 실리는 오픈소스형 콘솔 서버작업 관리자에 자주 잡힘
WindowsTerminal.exe터미널 UI탭과 창, 설정 UI

GitHub microsoft/terminal 토론에서 메인테이너는 OpenConsole과 conhost가 같은 코드 계열이라고 설명한다. Windows 빌드 시스템으로 빌드하면 conhost가 되고, Terminal과 함께 배포되는 OpenConsole은 ConPTY 쪽에 더 가까운 최신 쪽이다. 그래서 폭주 때 OpenConsole.exe가 많이 보이는 것은 “이상한 악성 파일”이라기보다 ConPTY 세션이 많이 열린다는 신호에 가깝다.

Windows Terminal의 windowingBehavior 기본값은 문서상 useNew 다. wt나 기본 터미널 경로로 새 인스턴스가 붙을 때 항상 새 창을 만든다. useExisting 또는 useAnyExisting이면 기존 창에 탭으로 붙는다. wt -w -1은 새 창, wt -w 0은 최근 창이다. 폭주 상황에서 창 개수가 폭발하는 이유 중 하나가 이 기본값과 맞물린다.

반복되는 원인 패턴

Orca만이 아니다. 공개된 사례를 묶으면 패턴이 네 갈래로 모인다.

터미널 폭주 흔한 원인 네 가지
그림 2. 데몬 숨김 실패, 훅 스크립트 연결, 업데이터 마커, 시작 바로가기가 대표 원인이다.

터미널 데몬이 자식을 숨기지 못하는 경우

로컬 코딩 에이전트용 터미널 데몬은 보통 Electron 또는 단독 node.exe 위에서 PTY를 연다. Orca 쪽 2026년 7월 커밋은 원인을 짧게 적는다. Electron에 묶인 Node는 windowsHide 기본이 true인데, 단독 node.exe 데몬은 기본이 false라서 child_process와 node-pty kill 경로의 콘솔 목록 에이전트가 몇 초마다 Windows Terminal 창을 열었다 닫는다.

같은 계열 문제는 node-pty 이슈와 ConPTY 호스트 패치에도 반복된다. GUI 서브시스템 부모가 콘솔이 없는 상태에서 ConPTY 자식을 만들면 Windows가 보이는 콘솔을 할당하는 경우가 있고, 기본 터미널이 Windows Terminal이면 그 창이 사용자 화면에 그대로 나타난다.

에이전트 훅이 Windows 파일 연결로 .sh를 여는 경우

Cursor 포럼(2026년 6월)에는 Agent 작업 중 외부 Git Bash 창이 수백 개 뜨는 보고가 있다. 스태프 답변에 따르면 postToolUse / afterFileEdit 훅이 캐시된 플러그인의 원시 .sh 경로를 가리키고, Windows는 그 경로를 Cursor 내장 셸이 아니라 파일 연결(Git Bash bash --login -i) 로 연다. 편집·툴 호출마다 훅이 돌면 창이 누적된다. IDE의 “Kill All Terminals”로는 안 닫힌다. 통합 터미널 탭이 아니라 외부 프로세스이기 때문이다.

cursor-agent 업데이터 대기 프로세스가 OpenConsole을 깜빡이는 경우

Cursor CLI(cursor-agent) Windows 이슈(2026년 10월)에서는 스테이지된 업데이트의 .pending.replace.cmd 대기 프로세스가 tasklist / find를 반복 호출하면서 초당 한 번 꼴로 콘솔이 깜빡인 사례가 있다. 강제 종료 뒤 남은 versions\\.running\ 마커, 재사용된 PID, OpenConsole.exe -Embedding 자식이 겹치면 수십 분 동안 이어질 수 있다. 스태프도 진단이 맞다고 확인했고, 에이전트가 없을 때 stale .running 마커를 지우고 pending cmd를 끊는 우회가 공유됐다.

시작 프로그램과 런너 스크립트가 재로그온마다 다시 켜는 경우

Startup 폴더의 .lnk는 대화형 로그온 때 실행된다. Microsoft 지원 문서의 shell:startup 경로는 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 이다. 여기에 터미널 데몬이나 에이전트 런너 바로가기가 남아 있으면, 재부팅으로 폭주를 “끊은” 것처럼 보여도 다음 로그인에 다시 시작된다. 프로젝트 폴더의 run.ps1 같은 러너가 Start-Process로 wt나 콘솔을 반복 호출하면, 사람이 의도한 한 번 실행이 루프가 된다.

패턴대표 트리거창이 늘어나는 단위
데몬 숨김 실패CIM 프로브, pty kill helper수 초 간격 깜빡임
훅 .sh 연결파일 편집·툴 호출편집 1회당 창 1개 이상
업데이터 대기stale .running + pending cmd폴링 주기마다 깜빡임
Startup / 런너로그온, 스크립트 루프세션 시작·루프 주기

2026년 10월 23일 사례에서 겹친 것

같은 날 Windows PC에서 관측된 폭주는 단일 원인이 아니었다. Cursor CLI(cursor-agent의 stream-json 출력 모드), ACP 호스트, 터미널 데몬(Orca daemon-host)이 겹쳤고, 화면에는 OpenConsole / Windows Terminal 창과 여러 봇 창이 함께 쌓였다.

중요한 관찰은 에이전트 프로세스만 종료해도 부족했다는 점이다. 데몬이 살아 있는 동안 콘솔이 계속 열렸다. 적용된 조치는 앱 제거, Startup의 Orca.lnk 삭제, 러너 run.ps1을 run.ps1.DISABLED-flood처럼 이름 바꿔 비활성화한 것이다. AppData\Roaming\orca 캐시 폴더는 바이너리 없이도 남을 수 있으나, 시작 바로가기와 실행 파일이 없으면 그 자체로 창을 만들지는 않는다.

이 사례에서 읽을 교훈은 단순하다. 폭주 중에는 “가장 눈에 띄는 창의 부모”와 “로그온마다 다시 켜지는 진입점”을 같이 끊어야 한다. 폭주가 났던 러너를 그대로 다시 켜는 안다는 재발을 부른다.

진단에 쓰는 명령과 경로

폭주가 한창일 때는 프로세스 수부터 본다.

Get-Process WindowsTerminal, OpenConsole -ErrorAction SilentlyContinue |
  Group-Object ProcessName |
  Select-Object Name, Count

부모-자식 관계는 작업 관리자 세부 정보에서 확인하거나, 필요하면 Process Explorer 같은 도구로 OpenConsole의 부모를 본다. 부모가 daemon-host, node, cursor-agent, cmd(pending.replace) 중 무엇인지가 갈린다.

시작 진입점은 폴더와 레지스트리를 같이 본다.

$startup = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup"
Get-ChildItem $startup -Filter *.lnk | ForEach-Object {
  $s = (New-Object -ComObject WScript.Shell).CreateShortcut($_.FullName)
  [pscustomobject]@{ Name = $_.Name; Target = $s.TargetPath; Args = $s.Arguments }
}

Get-CimInstance Win32_StartupCommand |
  Select-Object Name, Command, Location, User

Cursor 쪽이면 Settings의 Hooks 목록에서 .sh로 끝나는 명령을 확인한다. cursor-agent면 %LOCALAPPDATA%\cursor-agent\versions 아래 .running 마커와 pending-launchers\*.pending.replace.cmd 존재 여부를 본다. 에이전트가 실제로 돌고 있지 않은데 마커만 많으면 업데이터 깜빡임 후보이다.

Windows Terminal 설정 UI의 Startup에서 Default terminal application, New instance behavior(windowingBehavior) 도 확인한다. 창이 탭 대신 창으로만 쌓이면 useNew와의 조합을 의심한다.

폭주가 난 순간에 끄는 순서

순서가 바뀌면 “닫았는데 또 뜬다”가 반복된다.

  1. 새 창을 만드는 부모를 먼저 찾는다. 데몬, 업데이터 pending cmd, 훅을 쏘는 IDE/플러그인, 루프 중인 run.ps1 중 무엇인지 고른다.
  2. 그 부모 트리부터 종료한다. 자식 OpenConsole만 클릭으로 닫으면 부모가 즉시 다시 만든다.
  3. Startup .lnk와 자동 실행 런너를 제거하거나 이름을 바꿔 재진입을 막는다.
  4. 그다음에야 남은 Windows Terminal / OpenConsole 잔여를 정리한다.
  5. 재로그온 또는 재부팅 뒤 Get-Process로 개수가 다시 안 늘어나는지 확인한다.
터미널 폭주 재발 방지 순서
그림 3. 원인 프로세스 → 시작 바로가기 → 런너 비활성 → 재부팅 후 확인 순서가 안전하다.

하지 않는 편이 나은 것도 있다. 폭주 중인 러너를 “다시 한 번 실행해서 고치기”, 원인 불명인 채 taskkill /F /IM WindowsTerminal.exe만 반복하기, Startup 바로가기를 남긴 채 창만 닫기, stale 마커를 살아 있는 cursor-agent가 있는 상태에서 함부로 지르기(업데이트·세션 꼬임)다. Colin이 공유한 cursor-agent 우회도 에이전트가 없을 때 .running을 지우는 전제였다.

재발을 줄이는 설정과 습관

로컬 에이전트를 쓰는 Windows 환경에서 효과가 큰 쪽만 적는다.

Windows Terminal에서는 New instance behavior를 상황에 맞게 useExisting 계열로 두는 것을 검토한다. 기본 useNew는 의도된 동작이지만, 실수로 wt가 반복 호출되면 창 수가 바로 는다. 기본 터미널 앱을 무엇으로 둘지는 취향이지만, “숨기지 않은 콘솔 자식이 화면에 어떻게 보이는지”를 결정한다.

Cursor에서는 Hooks에 원시 .sh 경로가 있는지 본다. Windows에서는 .ps1 래퍼나 명시적 bash -c처럼 파일 연결을 거치지 않는 형태가 안전하다. 포럼에서 확인된 것처럼 deploy-on-aws 같은 이름과 무관하게 postToolUse가 매 툴 호출에 돌 수 있다. 에이전트마다 콘솔이 깜빡이면 "terminal.integrated.windowsUseConptyDll": true 설정이 거론된 바 있다. 버전별로 효과가 다를 수 있어, 적용 전후 창 생성 여부를 직접 확인하는 편이 맞다.

cursor-agent를 스크립트로 자주 돌리면 강제 종료 뒤 %LOCALAPPDATA%\cursor-agent\versions\*\.running\ 잔여와 pending-launchers를 점검한다. 정상 종료에서도 마커가 남는다는 후속 보고가 있어, CLI를 자동화에 넣는 환경에서는 마커 정리가 운영 절차에 들어간다.

프로젝트 런너는 한 번 실행하고 끝나는지, Start-Process로 wt를 루프하는지 코드를 읽는다. 폭주를 만든 러너는 비활성 이름(*.DISABLED-flood)으로 남겨 실수 재실행을 막는다. 터미널 데몬 앱을 쓰지 않는다면 Startup의 해당 .lnk를 제거한다. 캐시 폴더만 남은 것과 실행 파일·바로가기가 남은 것은 다르다.

확인 항목위치정상 신호
Startup 바로가기shell:startup불필요 데몬/런너 .lnk 없음
HooksCursor Settings → Hooks원시 .sh 절대 경로 없음
cursor-agent 마커%LOCALAPPDATA%\cursor-agent\versions유령 .running·orphan pending 없음
windowingBehaviorWT Settings → Startup의도에 맞는 useNew / useExisting
런너 스크립트프로젝트 run.ps1 등콘솔 루프·자동 재기동 없음

마무리

앞에서 다룬 윈도우 터미널 폭주의 핵심만 짧게 정리한다.

  • OpenConsole이 많이 보이면 ConPTY 세션이 많이 열린 신호로 읽는 편이 맞다
  • Orca형 데몬, Cursor 훅 .sh, cursor-agent 업데이터 대기, Startup .lnk가 대표 반복 패턴이다
  • 에이전트만 종료하고 데몬과 런너, 바로가기를 남기면 창이 다시 뜬다
  • 끌 때는 부모, 시작 진입점, 잔여 콘솔, 재로그온 확인 순서가 안전하다
  • 폭주를 만든 러너를 그대로 재활성화하지 않는다

「창을 닫기 전에, 창을 다시 여는 부모를 끊는다.」 로컬 에이전트 PC에서는 Startup, Hooks, .running 마커, windowingBehavior 네 곳을 주기적으로 보면 같은 사고가 덜 반복된다.

출처와 링크

조사 기준: 2026년 10월.

FAQ

자주 묻는 질문

OpenConsole.exe가 많이 보이면 악성 프로그램인가요?

대개는 아닙니다. microsoft/terminal 메인테이너 설명에 따르면 OpenConsole은 Windows Terminal과 함께 배포되는 콘솔 서버로, ConPTY 세션이 열릴 때 자주 보입니다. 개수가 비정상적으로 늘면 누군가 콘솔 세션을 반복 생성한다는 신호로 읽는 편이 맞습니다.

에이전트 창만 닫으면 폭주가 멈추나요?

아닌 경우가 많습니다. 터미널 데몬, cursor-agent 업데이터 대기 cmd, 훅을 쏘는 프로세스, Startup 바로가기가 남아 있으면 OpenConsole이나 Windows Terminal이 다시 열립니다. 부모 프로세스와 로그온 진입점을 같이 끊어야 합니다.

Cursor에서 Git Bash 창만 수백 개 뜨면 어디를 보나요?

Settings의 Hooks에서 원시 .sh 경로를 확인합니다. Windows는 그 경로를 파일 연결로 Git Bash에 넘기는 경우가 있고, postToolUse처럼 매 툴 호출에 돌면 창이 누적됩니다. Kill All Terminals로는 외부 프로세스가 닫히지 않습니다.

windowingBehavior를 바꾸면 폭주가 사라지나요?

창이 탭 대신 새 창으로만 쌓이는 증상을 줄일 수는 있습니다. 기본값 useNew는 새 인스턴스마다 창을 만듭니다. 다만 숨기지 않은 콘솔 자식을 반복 생성하는 부모 프로세스가 있으면 근본 원인은 그대로입니다.

cursor-agent 콘솔 깜빡임은 어떻게 다루나요?

에이전트가 돌지 않을 때 versions 아래 유령 .running 마커를 정리하고, pending-launchers의 pending.replace.cmd 대기를 종료하는 우회가 포럼에 공유되어 있습니다. 살아 있는 에이전트 세션이 있는 상태에서 마커를 지우면 업데이트나 세션이 꼬일 수 있습니다.

Startup 폴더는 어디인가요?

현재 사용자 기준은 shell:startup, 즉 AppData Roaming Microsoft Windows Start Menu Programs Startup 입니다. 여기에 터미널 데몬이나 런너 바로가기가 있으면 재로그온 때마다 다시 시작됩니다.

폭주를 만든 run.ps1을 다시 켜도 되나요?

원인을 고치지 않은 채 그대로 재활성화하면 같은 증상이 재발하기 쉽습니다. 콘솔 루프나 자동 재기동, 숨김 없는 Start-Process가 없는지 확인한 뒤에만 복구하는 편이 안전합니다.