개발/Visual Studio Code

커맨드 팔레트 38부: VS Code 실행 중 Task 하나만 새 정의로 재시작하기

반응형
VS CODE 초보자 시리즈 · 커맨드 팔레트 38부

실행 중 Task 하나만 새 정의로 다시 시작하기

Target과 Guard를 함께 실행한 뒤 Tasks: Restart Running Task에서 Target만 골라, 저장한 VERSION=2 정의로 교체하고 Guard가 그대로인지 확인합니다.

Target은 새 RUN_ID와 VERSION=2를 받고, Guard는 기존 RUN_ID와 이어지는 heartbeat를 유지하면 완료입니다.

한 설정만 바꿨는데 모든 개발 서버와 감시기를 다시 시작하면 관계없는 연결도 끊깁니다. 이 명령은 실행 중 목록에서 선택한 하나만 다시 시작합니다.

1. 시작하기 전에

난이도는 초급입니다. 다만 Task 재시작은 선택한 실행 중 프로세스를 종료하므로 실제 서버·배포 대신 별도 연습 폴더에서 진행합니다.

준비할 것

  • Windows 11에서 VS Code Stable로 빈 폴더 열기 — 확인: Explorer에 폴더명이 보이고 Terminal > Run Task를 사용할 수 있습니다.
  • PowerShell 실행 가능 상태 — 확인: 새 Terminal에서 $PSVersionTable.PSVersion이 버전을 출력합니다.
  • 기존 .vscode/tasks.json 백업 — 확인: 원본과 복사본을 Compare해 차이가 없습니다.

적용 환경 2026-09-06 KST · Windows 11 · VS Code Stable 1.136.1 · PowerShell

안전하게 시작하기 선택 재시작도 대상 프로세스의 메모리 상태와 연결을 보존하지 않습니다. 저장 중인 빌드·배포·데이터 처리 Task에는 적용하지 마세요. 중단 조건: 예상하지 못한 Running Task, 백업하지 않은 tasks.json, 이해하지 못한 명령, 복구할 수 없는 프로세스 상태가 하나라도 있으면 멈춥니다.

2. 알아둘 핵심 개념

Restart Running Task

현재 실행 중인 Task 하나를 골라 종료한 뒤 다시 실행하는 명령입니다. 실행 중 항목이 여러 개면 Select the task to restart 목록이 나타나고, 하나뿐이면 바로 재시작합니다.

최신 저장 정의

Stable 구현은 재시작 직전에 Workspace Task 구성을 갱신하고 같은 Task ID의 최신 정의를 찾습니다. 따라서 tasks.json을 저장한 다음 Target을 재시작하면 새 VERSION=2가 나타나야 합니다. 미저장 편집 내용은 완료 근거가 아닙니다.

Target과 Guard

Target은 의도적으로 바꿀 대상이고 Guard는 대상 밖 동료 Task입니다. Target의 새 RUN_ID와 VERSION=2뿐 아니라 Guard의 같은 RUN_ID와 이어지는 heartbeat도 확인해야 선택 범위를 검증할 수 있습니다.

RUN_ID

프로세스 시작 때마다 자동 생성되는 8자리 표식입니다. 사용자가 치환하지 않습니다. Target ID 변화는 새 실행을, Guard ID 유지와 heartbeat 증가는 같은 실행 보존을 뜻합니다.

3. 순서대로 진행하기

각 단계의 정상 결과를 확인한 뒤 다음 단계로 이동합니다.

1. 보호 대상과 현재 실행 목록 확인

목적 실제 업무 Task를 실수로 중단하지 않도록 실습 범위를 격리합니다.

  1. 빈 연습 폴더를 열고 Ctrl+Shift+P → Tasks: Show Running Tasks를 실행합니다.

입력 위치 VS Code 명령 팔레트.

확인 대상: Workspace 폴더명, 실행 중 Task 이름과 개수
정상 결과 실행 중 항목이 없거나 사용자가 목적을 아는 항목만 보입니다.

확인 목록의 모든 이름을 읽고 중단 가능한지 판단합니다.

실패 신호 배포·데이터 처리·실제 서버처럼 중단하면 안 되는 항목이 보입니다.

주의 기존 Task는 종료하지 않습니다. 되돌리기: 명령을 취소하고 별도 빈 폴더를 새 창에서 연 뒤 이 단계로 돌아옵니다.

2. 기존 tasks.json 백업

목적 실습 뒤 원래 Task 구성을 정확히 복원합니다.

  1. .vscode/tasks.json이 있으면 Workspace 밖의 사용자가 아는 위치에 복사합니다.

입력 위치 VS Code Explorer와 Windows 파일 탐색기.

.vscode/tasks.json
tasks.json.backup
정상 결과 원본과 백업의 내용이 동일합니다.

확인 Select for Compare와 Compare with Selected로 차이가 없는지 봅니다.

실패 신호 백업 위치를 찾을 수 없거나 비교 결과가 다릅니다.

주의 백업 전 전체 파일을 덮어쓰지 않습니다. 되돌리기: 예제를 추가하지 말고 백업부터 다시 만든 뒤 이 단계에 재합류합니다.

3. VERSION=1 Target과 Guard 추가

목적 선택 재시작 전 기준이 되는 두 장기 실행 Task를 만듭니다.

  1. 아래 JSON을 새 .vscode/tasks.json으로 저장합니다. 기존 파일이 있으면 tasks 배열에 두 객체만 병합합니다.

입력 위치 연습 Workspace의 .vscode/tasks.json.

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "JCOS Restart Target",
      "type": "process",
      "command": "powershell.exe",
      "args": ["-NoProfile", "-Command", "$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('RESTART_TARGET VERSION=1 RUN_ID=' + $id); 1..60 | ForEach-Object { Start-Sleep -Seconds 2; Write-Output ('RESTART_TARGET HEARTBEAT=' + $_) }"],
      "problemMatcher": [],
      "presentation": {"reveal":"always","focus":false,"panel":"dedicated","group":"jcos-restart-one","clear":true,"showReuseMessage":false}
    },
    {
      "label": "JCOS Restart Guard",
      "type": "process",
      "command": "powershell.exe",
      "args": ["-NoProfile", "-Command", "$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('RESTART_GUARD VERSION=GUARD RUN_ID=' + $id); 1..60 | ForEach-Object { Start-Sleep -Seconds 2; Write-Output ('RESTART_GUARD HEARTBEAT=' + $_) }"],
      "problemMatcher": [],
      "presentation": {"reveal":"always","focus":false,"panel":"dedicated","group":"jcos-restart-one","clear":true,"showReuseMessage":false}
    }
  ]
}
정상 결과 JSON 오류가 없고 두 label, Target VERSION=1, Guard VERSION=GUARD가 보입니다.

확인 type은 process, command는 powershell.exe, panel은 dedicated, group은 jcos-restart-one인지 확인합니다.

실패 신호 빨간 밑줄, 중복 label, Incorrect type 또는 End of file expected가 보입니다.

주의 명령 전체를 읽고 파일 삭제·전송이 없음을 확인합니다. 되돌리기: 오류 원문을 보존하고 마지막 편집을 Undo합니다. 원인 UNKNOWN이면 백업을 복원합니다.

4. 두 Task 실행과 기준값 기록

목적 Target과 Guard를 동시에 활성화하고 재시작 전 근거를 남깁니다.

  1. Tasks: Run Task에서 Target, 이어서 Guard를 각각 실행합니다.

입력 위치 명령 팔레트와 Terminal 패널.

RESTART_TARGET VERSION=1 RUN_ID=<8자리>
RESTART_GUARD VERSION=GUARD RUN_ID=<8자리>
정상 결과 두 전용 Terminal에서 heartbeat가 2초마다 증가합니다.

확인 두 RUN_ID와 Guard heartbeat 번호를 메모하고 Show Running Tasks에 두 항목이 있는지 봅니다.

실패 신호 한 Task가 즉시 끝나거나 두 출력이 같은 Terminal을 덮습니다.

주의 약 2분 뒤 자동 종료되므로 heartbeat가 보일 때 진행합니다. 되돌리기: 두 데모 Task만 종료하고 Step 3의 panel·group·저장 상태를 확인합니다.

5. Target 정의만 VERSION=2로 저장

목적 재시작이 저장된 최신 정의를 읽는지 확인할 변화를 만듭니다.

  1. Target의 VERSION=1 한 곳만 VERSION=2로 바꾸고 Ctrl+S로 저장합니다.

입력 위치 tasks.json의 JCOS Restart Target 객체 안 args 문자열.

RESTART_TARGET VERSION=2
정상 결과 JSON 오류가 없고 Guard 객체는 바뀌지 않으며 현재 Target Terminal은 아직 VERSION=1입니다.

확인 저장 표시가 사라졌고 파일 비교에서 숫자 한 곳만 바뀌었는지 봅니다.

실패 신호 Guard도 바뀌거나 파일이 미저장 상태이거나 JSON 오류가 생깁니다.

주의 저장 전 편집은 최신 정의 근거가 아닙니다. 되돌리기: Undo로 예상 밖 변경을 되돌리고 Target 문자열 한 곳만 다시 수정합니다.

6. Restart Running Task에서 Target 선택

목적 다른 실행 중 Task를 건드리지 않고 Target만 최신 정의로 교체합니다.

  1. Tasks: Restart Running Task를 열고 JCOS Restart Target을 선택합니다.

입력 위치 명령 팔레트와 Select the task to restart Quick Pick.

RESTART_TARGET VERSION=2 RUN_ID=<새 8자리>
정상 결과 Target heartbeat가 멈췄다가 VERSION=2와 새 RUN_ID로 다시 시작하고 Guard heartbeat는 이어집니다.

확인 선택 확정 전 Target 이름을 다시 읽습니다.

실패 신호 선택 목록이 안 보임, Failed to terminate and restart task, Task가 더 이상 존재한다는 경고, Guard 재시작.

주의 잘못 고른 Task도 실제로 종료됩니다. 되돌리기: 오류 원문과 이름을 보존하고 Show Running Tasks로 상태를 확인합니다. Guard를 잘못 골랐다면 두 데모를 종료하고 Step 4부터 다시 진행합니다.

7. Target 변화와 Guard 보존 교차 확인

목적 선택 재시작 범위와 최신 정의 반영을 독립적으로 확인합니다.

  1. 두 Terminal과 Tasks: Show Running Tasks를 차례로 확인합니다.

입력 위치 Terminal 패널과 명령 팔레트.

target_before != target_after
target_version == 2
guard_before == guard_after
정상 결과 Target RUN_ID만 바뀌고 Guard RUN_ID는 같으며 두 Task가 실행 중입니다.

확인 세 비교식을 하나씩 대조하고 Guard heartbeat가 증가했는지 봅니다.

실패 신호 Target ID 동일, VERSION=1 유지, Guard ID 변경 또는 Guard heartbeat 중단.

주의 Target만 바뀌어도 Guard가 끊겼다면 완료가 아닙니다. 되돌리기: 저장 상태와 Workspace 경로를 확인하고 Guard가 바뀌었다면 Step 4부터 재실행합니다.

8. 데모 종료와 롤백

목적 장기 실행 프로세스를 남기지 않고 원래 Workspace 상태로 돌아갑니다.

  1. Tasks: Terminate Task에서 두 데모 Task를 각각 종료하고 tasks.json 백업을 복원합니다.

입력 위치 명령 팔레트, Terminal 패널, Explorer.

최종 실행 중 Task: 0개
tasks.json: 백업과 동일
정상 결과 두 heartbeat가 멈추고 Running 목록에 항목이 없습니다.

확인 Show Running Tasks와 파일 Compare를 함께 사용합니다.

실패 신호 heartbeat가 계속되거나 기존 Task 정의가 사라집니다.

주의 All Running Tasks는 실제 업무 Task까지 끝낼 수 있으므로 각 데모를 이름으로 종료합니다. 되돌리기: 남은 데모만 다시 종료하고 기존 파일은 백업에서 복원한 뒤 완료 조건을 재검사합니다.

4. 완료 확인하기

입력 화면과 독립된 방법을 포함해 결과를 교차 확인합니다.

  • Target Terminal — VERSION=1에서 VERSION=2로 바뀌고 RUN_ID도 달라졌습니다.
  • Guard Terminal — RUN_ID는 전후가 같고 heartbeat 번호가 계속 증가했습니다.
  • Tasks: Show Running Tasks — 재시작 직후 두 항목, 종료 뒤 0개입니다.
  • tasks.json Compare — 실습 전 보호 대상과 최종 파일 사이에 의도하지 않은 차이가 없습니다.
완료 기준 선택한 Target만 저장된 새 정의로 재시작되고 Guard는 같은 실행을 유지했으며, 종료·복원 뒤 보호 대상에 차이가 없습니다.

5. 문제가 생겼다면

선택 목록이 나타나지 않음

먼저 확인 Show Running Tasks의 항목 수를 봅니다. Stable 구현은 하나뿐이면 선택 없이 바로 재시작합니다.

복구 두 데모를 다시 실행해 두 항목이 보이는 동안 Step 6으로 돌아옵니다.

재합류 VSC-033-S06

VERSION=1이 다시 나타남

먼저 확인 저장 표시, Problems 오류, 현재 Workspace의 실제 tasks.json 경로를 확인합니다.

복구 VERSION=2를 저장하고 Target이 실행 중인지 확인한 뒤 Target만 재시작합니다.

재합류 VSC-033-S05

Guard RUN_ID가 바뀜

먼저 확인 Quick Pick에서 선택한 실제 이름과 Guard Terminal의 첫 출력을 보존합니다.

복구 성공으로 판정하지 않습니다. 두 데모를 종료하고 Step 4부터 다시 시작합니다.

재합류 VSC-033-S04

Failed to terminate and restart task

먼저 확인 경고 원문, Task 이름, 각 Terminal 마지막 출력을 보존합니다. 원인을 권한이나 자식 프로세스로 단정하지 않습니다.

복구 Terminate Task에서 Target만 종료하고 종료 여부를 확인한 뒤 Run Task로 Target을 실행합니다. 원인 UNKNOWN이면 중단합니다.

재합류 VSC-033-S07

핵심 판단 Target 새 ID·VERSION=2와 Guard 같은 ID가 함께 확인되지 않으면 성공이 아닙니다. 원인을 확인하지 못하면 오류 원문과 마지막 출력을 보존하고 임의 변경 없이 중단합니다.

6. 핵심 정리와 공식 자료

  • Restart Running Task는 실행 중 목록에서 하나를 골라 종료 후 다시 실행합니다.
  • 재시작 전에 저장한 tasks.json의 같은 Task 최신 정의를 다시 찾습니다.
  • Target의 새 RUN_ID·VERSION=2와 Guard의 같은 RUN_ID를 함께 확인해야 합니다.
  • 실제 업무 Task에는 중단 영향, 보호 대상, 오류 보존과 롤백을 먼저 준비합니다.

공식 자료

아래 자료는 2026-09-06 KST에 확인했습니다. Stable API와 로컬 버전은 Windows x64 User Stable 1.136.1에 적용되며, 소스 링크는 같은 commit에 고정했습니다. 실제 Quick Pick과 Terminal 관찰은 독자 Human Gate입니다.

다음 편 예고 커맨드 팔레트 39부에서는 keybindings.json과 workbench.action.tasks.restartTask의 args로 자주 재시작하는 실행 중 Task를 직접 지정하고, Guard 보존과 단축키 충돌·롤백을 확인합니다.
반응형
이 글이 유용했다면 링크를 공유해 보세요.