로컬 AI 실측 노트

집 PC에 작업을 "던져 놓는" 법: GitHub 저장소 하나로 만드는 원격 작업 대기열

2026-09-27

노트북이나 휴대폰에서 집 PC에 "이거 돌려 놔"라고 맡기고, 결과만 나중에 받아 보고 싶을 때가 있습니다. 원격 데스크톱을 켜 두거나 공유기 포트를 여는 방법도 있지만, 이 사이트는 더 단순한 방법을 썼습니다. GitHub 저장소의 폴더 하나를 작업 대기열로 쓰는 것입니다. 이틀 동안 이 방식으로 PC 작업 110개 넘게(모델 받기·설정 변경 포함)를 돌렸고, 이 글은 그 구조를 누구나 따라 할 수 있게 줄인 버전입니다.

결론부터 정리하면 이렇습니다.

구조

휴대폰과 Claude가 노트북에 작업을 넣고, 노트북과 PC가 GitHub로 작업과 결과를 주고받는 구조도
이 사이트에서 실제로 쓴 구조. 이 글은 가운데의 "노트북 ↔ GitHub ↔ PC" 부분입니다.

저장소 안의 폴더는 이렇게 씁니다.

queue/pc/inbox/      ← 할 일 파일(.cmd / .ps1 / .sh)을 넣는 곳
queue/pc/done/       ← 끝난 작업 파일과 실행 기록(.log)이 옮겨지는 곳
queue/pc/results/    ← 작업이 만든 결과 파일
queue/pc/heartbeat.txt  ← PC가 마지막으로 살아 있던 시각

pc 자리는 기기 이름입니다. 기기가 여러 대면 queue/nas/, queue/laptop/처럼 폴더를 나누면 됩니다. 폴더는 실행기가 처음 돌 때 알아서 만듭니다.

준비물

따라하기

1. 저장소를 만들고 두 기기에 받기

GitHub에서 비공개 저장소를 만들고, 보내는 기기와 받는 PC 양쪽에서 git clone 합니다. 받는 PC에서는 로그인 창 없이 git pull·git push가 되는지 먼저 확인하세요. 실행기는 로그인 창을 띄우지 말라고 git에 알려 두지만, 로그인이 안 되면 매 회차 실패만 합니다. 커밋에 쓸 이름도 받는 PC의 저장소 폴더에서 한 번 정해 두세요(git config user.name "pc", git config user.email "메일 주소"). 없으면 결과가 올라가지 않습니다.

2. 실행기 파일 넣기

받는 PC의 저장소 폴더 밖(예: C:\work\remote_queue.py)에 실행기 파일(remote_queue.py)을 받아 둡니다. 약 220줄짜리 파이썬 파일이고, 한 회차에 하는 일은 이렇습니다.

  1. 이미 다른 회차가 도는 중이면 바로 끝냅니다(잠금 파일).
  2. 자기 대기열 폴더 밖의 로컬 변경과 git이 모르는 새 파일을 지우고 git pull 합니다. 받기가 막히면 원격 상태로 맞춘 뒤 이 기기가 만든 결과만 되살립니다.
  3. inbox의 파일을 이름 순서대로 하나씩 처리합니다. 실행하기 전에 먼저 done으로 옮기고 "실행 중" 기록을 올려 둡니다. 그래서 작업이 PC를 끄거나 실행기가 도중에 죽어도 같은 작업이 다시 돌지 않습니다.
  4. 실행이 끝나면 출력과 종료 코드를 done/<이름>.log에 적습니다.
  5. 자기 대기열 폴더만 커밋해서 올립니다. 올리기가 거절되면 한 번 받아서 합친 뒤 다시 올리고, 그래도 못 올린 커밋은 다음 회차에 올립니다.

손으로 한 번 돌려 봅니다.

python C:\work\remote_queue.py --repo C:\work\myrepo --device pc

3. 5분마다 자동으로 돌리기

PowerShell에서 아래를 실행하면 Windows 예약 작업이 등록됩니다. 경로는 자기 환경에 맞게 바꾸세요(pythonw.exe의 전체 경로는 where.exe pythonw로 확인할 수 있습니다).

$a = New-ScheduledTaskAction -Execute "C:\Python312\pythonw.exe" `
    -Argument "C:\work\remote_queue.py --repo C:\work\myrepo --device pc" -WorkingDirectory "C:\work\myrepo"
$t = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes 5)
$s = New-ScheduledTaskSettingsSet -StartWhenAvailable -MultipleInstances IgnoreNew `
    -ExecutionTimeLimit ([TimeSpan]::Zero) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -TaskName "RemoteQueue" -Action $a -Trigger $t -Settings $s

4. 작업 보내기

보내는 기기에서 queue/pc/inbox/에 파일을 만들고 올립니다. 이름 앞의 번호가 실행 순서입니다.

queue/pc/inbox/010_sysinfo.cmd
rem timeout=300
chcp 65001 > nul
systeminfo | findstr /c:"OS" /c:"Memory"
nvidia-smi --query-gpu=name,memory.used --format=csv

5. 결과 받기

5분쯤 뒤 보내는 기기에서 git pull 하면 queue/pc/done/010_sysinfo.log가 생겨 있습니다.

job: 010_sysinfo.cmd
start: 2026-09-27 14:07:32
end: 2026-09-27 14:07:34
exit: 0
========================================
...

exit: 0이 아니면 실패한 작업입니다. exit: running에서 멈춰 있으면 실행 도중 PC가 꺼졌거나 실행기가 죽은 것입니다. heartbeat.txt의 시각이 오래됐으면 PC가 꺼졌거나 예약 작업이 멈춘 것입니다(작업이 없을 때는 한 시간에 한 번만 갱신합니다).

실제로 막혔던 것과 해결

이 사이트를 운영하며 겪은 문제들입니다. 위 실행기에는 해결책이 이미 들어 있습니다.

겪은 문제 증상 해결
줄바꿈(CRLF) 변환 받는 PC에서 git이 파일을 "바뀜"으로 보고 pull이 계속 실패 받는 PC는 자기 폴더 밖 변경을 매번 버림. 저장소에 .gitattributes 추가
고친 파일이 옛 내용으로 실행됨 한 번은 옛 제목 목록으로 자료를 받아 다시 돌려야 했음. 처음에는 받는 PC가 옛 사본을 올린 탓으로 봤지만, 실제로는 보내는 쪽에서 옛 파일을 올린 것이었음 보낸 뒤 파일 크기로 새 내용이 갔는지 확인. 받는 PC가 다른 폴더를 되돌리는 일도 없도록 자기 대기열 폴더만 올림
충돌 흔적이 남음 한 번 충돌한 뒤로 모든 회차가 실패 매 회차 시작 때 멈춘 rebase를 취소하고 폴더 밖 변경을 되돌림
빈 커밋이 쌓임 할 일이 없어도 5분마다 커밋 작업이 없으면 한 시간에 한 번만 살아 있음을 기록
PC가 절전 모드로 들어감 밤에 넣어 둔 작업이 아침에 PC를 깨운 뒤에야 돌았음 전원 설정에서 절전을 끄거나(powercfg /change standby-timeout-ac 0), 예약 작업 설정에 -WakeToRun을 추가(전원 옵션의 "절전 모드 해제 타이머 허용"이 켜져 있어야 하고, 5분마다 PC를 깨웁니다)

마지막 줄과 관련해, 밤새 작업을 넣을 때 "다 끝나면 PC 끄기" 작업을 맨 뒤에 넣고 싶을 수 있습니다. 이 실행기는 실행 전에 작업을 done으로 옮기고 올려 두므로 끄기 작업이 켤 때마다 반복되지는 않습니다. 다만 끄기 작업은 결과가 다 올라간 뒤 꺼지도록 shutdown /s /t 120처럼 몇 분 여유를 두세요.

.gitattributes는 저장소 맨 위에 이렇게 두면 됩니다. Windows 배치 파일은 CRLF로, 셸 스크립트는 LF로, 나머지는 git이 알아서 맞추게 합니다(git 문서). 이미 올린 파일이 있는 저장소라면 추가한 뒤 git add --renormalize .로 한 번 다시 맞춰 주세요.

* text=auto
*.cmd text eol=crlf
*.bat text eol=crlf
*.ps1 text eol=crlf
*.sh text eol=lf

.sh 작업은 받는 PC에 Git Bash가 bash로 잡혀 있어야 합니다. WSL의 bash가 먼저 잡히면 C:\ 경로를 못 찾을 수 있습니다.

공개 전에 한 시험

이 실행기는 이 사이트에서 쓰는 것을 줄인 버전입니다. 공개 전에 독립 검토를 한 번 받았고, 거기서 나온 문제(처음 실행할 때 결과가 안 올라가는 문제, 올리기 실패 뒤 결과가 한참 늦게 오는 문제, 작업이 띄운 프로그램 때문에 실행기가 멈추는 문제, 같은 작업이 두 번 도는 문제 등)를 고친 뒤 다시 시험했습니다.

시간 초과 때 하위 프로세스까지 끄는 이유는, 이 사이트에서 남은 프로세스가 그래픽 메모리를 붙잡아 측정이 두 배 넘게 느려진 적이 있어서입니다(자세한 이야기). 그때는 제한 시간 때문이 아니라 Ollama를 강제로 끄면서 남은 프로세스였지만, 작업이 남긴 프로그램이 다음 작업을 방해할 수 있다는 점은 같습니다.

보안: 이것만은 꼭

한계