세 줄 요약

 

  1. 증상: VS Code 업데이트 후 Remote-SSH 「Downloading VS Code Server」 반복, 접속 실패
  2. 원인: 서버의 agent host 여러 개가 같은 버전을 동시에 설치하다 충돌, bin/code-server 없는 폴더 생성
  3. 해결: bin/ 없는 Stable-<커밋> 삭제, .staging 폴더 이름에서 .staging 빼기, 남은 agent host 종료

 

[고치기 전]
~/.vscode-server/cli/servers/
├── Stable-<커밋>/            ← VS Code가 실행하는 폴더
│   └── server/
│       ├── node_modules/     ← 일부만 있음
│       ├── LICENSE
│       └── (bin/ 없음)       ← 원인: 실행할 code-server 없음
└── Stable-<커밋>.staging/    ← 다 들어 있음, VS Code는 안 씀
    └── server/bin/code-server

[고친 후] bin/ 없는 폴더 삭제, .staging 빼기
~/.vscode-server/cli/servers/
└── Stable-<커밋>/            ← 원래 .staging, 실행 성공
    └── server/bin/code-server

 


 

VS Code를 업데이트한 뒤 Remote-SSH로 서버에 접속이 안되는 문제가 있었다. 오른쪽 아래에는 「Downloading VS Code Server」 알림만 계속 표시되었다. 다른 서버는 다 접속이 되는데 한 서버만 그랬다. 한 번 해결한 뒤에도 VS Code를 업데이트할 때마다 같은 서버에서 세 번 반복돼서 원인까지 찾아봤다.

 

내 사용 환경은 아래와 같다.

 

  • 내 PC: 윈도우 11, VS Code 1.135 ~ 1.142, Remote-SSH 확장 0.128
  • 원격 서버: 우분투 24.04 (x86_64)
  • 접속: 내 PC의 VS Code에서 Remote-SSH로 서버에 접속해서 작업한다. 같은 서버에 VS Code 창을 여러 개 열어 두고 쓴다.

 

VS Code가 서버에 서버용 프로그램을 설치하고 실행하는 순서는 아래와 같다. 이 순서를 알아야 문제가 어디서 생기는지 알 수 있다.

 

  1. 새 버전을 내려받아 ~/.vscode-server/cli/servers/Stable-<커밋>.staging 에 푼다.
  2. 다 풀리면 .staging 폴더 이름을 Stable-<커밋> 으로 바꾼다.
  3. 접속할 때 Stable-<커밋> 폴더가 있으면 설치된 것으로 보고 Stable-<커밋>/server/bin/code-server 를 실행한다.

 

Remote-SSH 로그(Output 패널에서 Remote - SSH 선택)를 보면 아래와 같은 순서로 반복된다.

 

Found existing installation
.../Stable-<커밋>/server/bin/code-server 실행 → 바로 종료
SSH Resolver called ... attempt 2 (Reconnection)
SSH Resolver called ... attempt 3 (Reconnection)
...

 

즉, 3번에서 Stable-<커밋> 폴더가 있으니 설치된 것으로 보고 code-server 를 실행했는데 바로 종료되고, 다시 접속하기를 반복한다. 재접속할 때마다 「Downloading VS Code Server」 알림이 표시된다.

 

서버에서 확인해 보니 설치 순서의 2번이 제대로 끝나지 않은 상태였다. Stable-<커밋> 폴더는 있는데 그 안에 파일이 일부만 있고 server/bin/code-server 가 없었다. 다 풀린 파일은 .staging 에 그대로 남아 있었다(맨 위 세 줄 요약 아래의 구조). 그런데 VS Code는 3번에서 폴더가 있는지만 확인하고 안에 실행 파일이 있는지는 확인하지 않는다. 폴더가 있으니 새로 내려받지도 않아서 같은 실패를 계속 반복한다.

 

설치 순서의 2번이 제대로 끝나지 않은 이유는 서버에 agent host 라는 VS Code 백그라운드 프로세스가 5개 실행 중이었기 때문이다. 같은 서버에 창 4개를 한꺼번에 재접속했을 때 창마다 하나씩 실행된 것이 접속이 끊긴 뒤에도 83일째 종료되지 않고 있었다. 이 프로세스들은 매시간 새 버전이 있는지 확인하고 위 1~2번을 서버에서 직접 한다. 그래서 새 버전이 배포되면 둘 이상이 같은 버전을 동시에 설치하다가 2번(폴더 이름 바꾸기)에서 충돌한다. 로그(~/.vscode-server/cli/agent-host-stable.log)에는 그 시각에 Directory not empty (os error 39) 가 기록되어 있었다. 즉, bin/ 이 없는 폴더는 내 VS Code를 업데이트하기 6일 전에 이미 만들어져 있었고, 내 VS Code를 그 버전으로 업데이트한 날 3번에서 접속이 안 된 것이다.

 

 

이건 VS Code 쪽 설계 문제로 보인다. 같은 서버에 창을 여러 개 열어 쓰는 경우 agent host 가 여러 개 실행될 수 있는데, 이것들이 동시에 설치하는 경우를 막지 못했다. 실제로 VS Code CLI 코드(cli/src/download_cache.rs)에는 2026년 8월 말에 동시 설치 충돌을 막는 수정이 들어갔다. 내 서버의 agent host 들은 그 전인 7월 말부터 실행 중이던 옛 버전이었다. 그러나 같은 코드에서 설치 여부를 판단하는 부분(exists, create)은 지금도 폴더가 있는지만 확인해서, 이런 폴더가 한 번 생기면 직접 고쳐야 한다.

 

내 VS Code 커밋은 Help > About 에서 볼 수 있다(Commit 항목). 서버에 접속해서 아래 명령어로 확인하면 된다.

 

ls ~/.vscode-server/cli/servers/
ls ~/.vscode-server/cli/servers/Stable-<커밋>/server/bin/code-server

 

두번째 명령어에서 파일이 없다고 표시되면 code-server 가 없는 경우다. 이 때 옆에 Stable-<커밋>.staging 폴더가 같이 있을 수 있는데, 내 경우엔 세 번 모두 여기에 bin/code-server 까지 다 들어 있었다.

 

해결법은 bin/ 이 없는 Stable-<커밋> 폴더를 지우고, Stable-<커밋>.staging 폴더 이름에서 .staging 을 빼는 것이다. 즉, 설치 순서의 2번을 직접 하는 것이다.

 

cd ~/.vscode-server/cli/servers
rm -rf Stable-<커밋>
mv Stable-<커밋>.staging Stable-<커밋>
Stable-<커밋>/server/bin/code-server --version

 

마지막 명령어에서 버전이 표시되면 VS Code에서 다시 접속하면 된다. 다른 버전의 .staging 폴더들도 남아 있으면 지워도 된다. 내 경우 이런 폴더가 쌓여서 3GB가 넘었다.

 

.staging 에도 bin/code-server 가 없다면 Stable-<커밋> 으로 시작하는 폴더를 다 지우고 다시 접속하면 새로 설치된다. 이 때는 설치가 끝날 때까지 VS Code 창을 닫지 않는 게 좋다.

 

rm -rf ~/.vscode-server/cli/servers/Stable-<커밋>*

 

다음 업데이트 때 같은 문제가 생기지 않게 하려면 agent host 가 몇 개 실행 중인지 서버에서 아래 명령어로 확인한다.

 

pgrep -u $USER -af "agent host"

 

여러 개면 VS Code 창을 다 닫고 PID를 지정해서 종료하면 된다. 다음에 접속하면 하나만 새로 실행된다.

 

kill <PID> <PID> ...

 

pkill -f "agent host" 처럼 패턴으로 종료하면 원격으로 명령을 보낸 셸 자신도 패턴에 걸려서 같이 종료될 수 있으니 PID를 지정하는 게 낫다.

 

CLI 코딩 에이전트에게 시킬 때

 

Claude Code, Codex CLI, Gemini CLI, OpenCode 같은 CLI 코딩 에이전트에게는 이 글 주소와 Remote-SSH 로그를 같이 주면 된다. 서버 작업까지 시킬 때는 bin/ 없는 폴더를 바로 지우지 말고 이름만 바꿔 두게 하는 게 낫다. 다른 폴더를 잘못 골라도 되돌릴 수 있기 때문이다.

 

mv Stable-<커밋> Stable-<커밋>.broken
mv Stable-<커밋>.staging Stable-<커밋>

 

접속이 되는 것을 확인한 뒤에 .broken 폴더를 지우면 된다.

Posted by 공돌이pooh
,