실행 중 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
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를 실수로 중단하지 않도록 실습 범위를 격리합니다.
- 빈 연습 폴더를 열고 Ctrl+Shift+P → Tasks: Show Running Tasks를 실행합니다.
입력 위치 VS Code 명령 팔레트.
확인 대상: Workspace 폴더명, 실행 중 Task 이름과 개수
정상 결과 실행 중 항목이 없거나 사용자가 목적을 아는 항목만 보입니다.
확인 목록의 모든 이름을 읽고 중단 가능한지 판단합니다.
실패 신호 배포·데이터 처리·실제 서버처럼 중단하면 안 되는 항목이 보입니다.
2. 기존 tasks.json 백업
목적 실습 뒤 원래 Task 구성을 정확히 복원합니다.
.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를 만듭니다.
- 아래 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가 보입니다.
4. 두 Task 실행과 기준값 기록
목적 Target과 Guard를 동시에 활성화하고 재시작 전 근거를 남깁니다.
- 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을 덮습니다.
5. Target 정의만 VERSION=2로 저장
목적 재시작이 저장된 최신 정의를 읽는지 확인할 변화를 만듭니다.
- 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 오류가 생깁니다.
6. Restart Running Task에서 Target 선택
목적 다른 실행 중 Task를 건드리지 않고 Target만 최신 정의로 교체합니다.
- 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 재시작.
7. Target 변화와 Guard 보존 교차 확인
목적 선택 재시작 범위와 최신 정의 반영을 독립적으로 확인합니다.
- 두 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 중단.
8. 데모 종료와 롤백
목적 장기 실행 프로세스를 남기지 않고 원래 Workspace 상태로 돌아갑니다.
- Tasks: Terminate Task에서 두 데모 Task를 각각 종료하고 tasks.json 백업을 복원합니다.
입력 위치 명령 팔레트, Terminal 패널, Explorer.
최종 실행 중 Task: 0개
tasks.json: 백업과 동일
정상 결과 두 heartbeat가 멈추고 Running 목록에 항목이 없습니다.
확인 Show Running Tasks와 파일 Compare를 함께 사용합니다.
실패 신호 heartbeat가 계속되거나 기존 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
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입니다.
- VS Code Stable Update API · Microsoft
- Integrate with External Tools via Tasks · Microsoft
- Stable task.contribution.ts · Microsoft
- Stable abstractTaskService.ts · Microsoft
keybindings.json과 workbench.action.tasks.restartTask의 args로 자주 재시작하는 실행 중 Task를 직접 지정하고, Guard 보존과 단축키 충돌·롤백을 확인합니다.'개발 > Visual Studio Code' 카테고리의 다른 글
| 커맨드 팔레트 40부: VS Code 실행 중 특정 Task만 단축키로 종료하기 (1) | 2026.09.08 |
|---|---|
| 커맨드 팔레트 39부: VS Code 자주 재시작하는 Task를 단축키로 바로 지정하기 (0) | 2026.09.08 |
| 커맨드 팔레트 37부: VS Code 실행 중인 여러 Task 한 번에 재시작하기 (1) | 2026.09.06 |
| 커맨드 팔레트 36부: VS Code Terminal 탭에서 같은 Task 바로 재실행하기 (0) | 2026.09.05 |
| 커맨드 팔레트 35부: VS Code Task Terminal을 아이콘과 색으로 빠르게 구분하기 (1) | 2026.09.04 |