소개
wmux는 HomeOps가 개발한 Windows용 터미널 세션 지속 도구입니다. 콘솔 세션을 시작한 뒤 창을 닫더라도 세션이 백그라운드에서 계속 실행되도록 하며, 필요할 때 다시 연결해 이전 상태 그대로 작업을 이어갈 수 있도록 합니다. Windows에서 부족했던 멀티플렉서 기능을 ConPTY 기반으로 직접 구현해 세션 수명만 보장하는 데 목적을 두고 있습니다.
상세정보
세션 지속과 분리·재연결
서버 프로세스는 DETACHED_PROCESS로 생성되어 자체 콘솔을 보유하지 않으므로, 세션을 시작한 창이 닫혀도 CTRL_CLOSE_EVENT가 서버에 전달되지 않습니다. 그 결과 장시간 빌드 같은 작업을 시작한 뒤 터미널을 닫고도 세션이 그대로 유지됩니다.
ConPTY 직접 사용과 vt100 재현
ConPTY 스트림과 vt100 터미널 모델을 서버에서 유지하여, 나중에 재연결할 때 화면 상태를 단일 repaint 이스케이프 시퀀스로 직렬화해 전달합니다. 재연결 시 tmux가 터미널 에뮬레이터를 내장하는 것과 같은 이유입니다.
tmux 호환 키 바인딩
Ctrl-B d로 분리, Ctrl-B Ctrl-B로 리터럴 Ctrl-B 입력을 전달합니다. PSReadLine의 Ctrl-B 충돌은 tmux 사용자가 이미 받아들이는 절충안이며, 환경 변수 WMUX_PREFIX로 재바인딩할 수 있습니다.
SSH 환경에서의 세션 보호
Windows의 sshd는 연결당 ConPTY를 생성하므로 연결이 끊기면 실행 중이던 작업도 함께 종료됩니다. wmux는 CREATE_BREAKAWAY_FROM_JOB로 서버를 생성해 SSH 세션이 잡고 있던 잡 오브젝트에서 벗어나도록 하며, breakaway가 거부되면 stderr에 그 사실을 표시합니다.
스크립팅용 비대화형 제어
run, send, capture는 콘솔 없이 동작하므로 스크립트나 터미널이 없는 다른 프로세스가 세션을 구동할 수 있습니다. run은 화면을 거치지 않고 파이프라인 결과를 CLIXML/JSON/text로 직렬화해 반환하며, 결과는 성공/실패/종료 코드를 담은 봉투로 감싸 실패도 데이터로 다룰 수 있게 합니다.
보안 모델
세션은 \.pipewmux.<your-SID>.<name> 명명 파이프로 노출되며 SYSTEM, Administrators, 본인에게만 접근 권한을 부여하는 명시적 DACL이 설정됩니다. 첫 인스턴스는 FILE_FLAG_FIRST_PIPE_INSTANCE로 생성되어 이름 선점이 하드 실패로 드러나며, 클라이언트는 SECURITY_IDENTIFICATION으로 연결해 서버가 연결 사용자를 가장하지 못하도록 합니다.
패널 분할이나 상태 표시줄도 지원하나요?
지원하지 않습니다. 탭, 분할, 검색, 설정은 Windows Terminal에 맡기고 wmux는 세션 지속성만 담당하도록 설계되었습니다.
설치 방법은 무엇인가요?
winget install HomeOps.wmux로 설치하거나 Rust 1.77+ 환경에서 cargo build --release로 소스에서 빌드할 수 있습니다.
SSH로 연결이 끊겨도 작업이 계속되나요?
CREATE_BREAKAWAY_FROM_JOB로 서버를 잡 오브젝트에서 분리시켜 세션이 SSH 연결 종료와 함께 사라지지 않도록 합니다.
스크립트가 터미널 없이 세션을 다룰 수 있나요?
run, send, capture는 콘솔을 요구하지 않아 콘솔 없는 프로세스에서도 세션을 구동하고 결과를 받을 수 있습니다.
시스템 요구사항
Rust 1.77+로 소스에서 빌드할 수 있습니다. 기본 동작은 Windows의 ConPTY에 의존하므로 Windows 10 1809 이상에서 동작합니다.


