Skip to content

CH 15 · 예약 작업과 백그라운드 실행

분량약 3,530자소요 시간약 20분선행 지식CH 05, CH 08, CH 14난이도재현 가능

본장 목표

이번 장은 한 가지 문제를 풉니다. "때가 되면 Agent가 스스로 일을 하게 하려면 어떻게 해야 하는가".

dsh의 "예약"은 두 개의 층이 있으며, 혼동하기 쉽습니다.

무엇인가전형적 시나리오
세션 내 리마인더 (공식 Schedule)같은 세션에서 모델에게 "X분 후에 알려줘""20분 후에 돌아와서 결과 확인해"
시스템 레벨 자동화 (headless + scheduler)Agent 전체가 작업을 하나 돌리고 종료하며, OS 스케줄러가 그 시각에 다시 띄움"매일 아침 9시에 AI 핫토픽 보고서를 보내줘"

장의 전반부에서는 공식 Schedule을 분명히 합니다 (선택 오버레이이며, 본문은 바로 쓸 수 있는 사용자 안내를 드립니다). 후반부는 이번 장의 핵심 실습입니다 — CH 14에서 설치한 aihot skill을 사용해, "AI 핫토픽을 예약해 스크레이핑"하는 예약 작업을 만듭니다.

공식 Schedule: 세션 내 시간 리마인더

이것은 무엇인가

공식 패키지 @deepseek-ai/dsh-schedule세션 내 리마인더를 제공합니다. 같은 세션에서 모델에게 "나중에 알려줘"라 합니다. 시각이 되면 이 세션에 일반 후속 메시지로 돌아옵니다.

이것은 **선택 가능한 능력(오버레이)**이며, 기본 꺼져 있습니다. 켜려면 dsh web을 시작할 때 패치를 추가합니다. 공식 예제는 공식 리포지터리의 apps/cli/config/examples/schedule/cordis.yml에 있으며, 그 상대 경로 명령은 클론한 공식 리포지터리의 루트 디렉터리에서 실행할 때만 작동하고, dsh만 npm install로 설치한 후에는 사용할 수 없습니다. 리포지터리를 클론하지 않았다면, 동등한 패치 파일을 직접 만들 수도 있습니다. 내용은 세 부분입니다 (공식 예제에서 그대로 옮겨 왔습니다).

yaml
# schedule.overlay.yml
- insert:
    - id: time-context
      name: '@deepseek-ai/dsh-time-context'
    - id: schedule
      name: '@deepseek-ai/dsh-schedule'
- id: ui-schedule
  disabled: false

그리고 시작할 때 이 파일을 가리킵니다.

bash
dsh web --patch C:\your-path\schedule.overlay.yml

세 가지를 합니다. dsh-time-context를 더하고 (모델이 브라우저 시간대의 시간을 이해하도록), dsh-schedule을 더하며 (리마인더 도구를 제공), ui-schedule을 활성화합니다 (대기 중인 리마인더를 UI에 표시).

사용법

활성화한 뒤 새 세션을 시작하면, 모델에게 세 가지 도구가 생깁니다.

도구하는 일
schedule_create리마인더 생성
schedule_list대기 중인 모든 리마인더 나열
schedule_deleteid로 취소

리마인더를 생성하는 세 가지 규칙입니다.

규칙설명
after몇 초 뒤에 한 번 알려줌 (일회성)
at특정 시각에 한 번 알려줌 (일회성)
every고정 간격 반복, 최소 5분

사용법은 자연어 한 문장이며, 예를 들어 "20분 후에 배포 결과 확인하러 온다고 알려줘"라 하면, 모델이 schedule_create를 호출하고 리마인더의 id, 대상 시각, 상태를 반환합니다.

경계

할 수 있는 일할 수 없는 일
세션 내 후속 메시지 리마인더이메일 / SMS / 푸시 / 브라우저 알림
재시작에도 살아남는 리마인더 (세션 로그에 저장)"매주 평일 9시" 같은 캘린더 / Cron 규칙
고정 간격 반복 (≥5분)세션이 닫혀 있으면 기한을 넘기며, 복구 후 가장 최근 것만 되돌림

한 줄 요약: 공식 Schedule은 "세션 안에서 그 시각에 알려주는" 일을 처리하며, "백그라운드에서 작업을 자동으로 돌리는" 것은 아닙니다. 후자 — 후반부에서 만들 예약 핫토픽 — 은 headless와 시스템 스케줄러가 함께 필요합니다.

핵심 실습: aihot이 매일 아침 AI 핫토픽을 보내도록

접근

CH 14에서 aihot(AI 핫토픽을 스크레이핑하는 검색 skill)을 설치했고, CH 05에서 headless(한 명령으로 작업을 돌리고 끝나면 종료)를 배웠습니다. 둘을 합치고 "정시에 다시 띄우는" 스케줄러를 더하면, 완전한 예약 핫토픽 작업이 됩니다.

headless가 aihot으로 핫토픽을 스크레이핑 → 파일에 쓰기 → 시스템 스케줄러가 매일 아침 9시에 이 명령을 다시 실행

1단계: 먼저 손으로 한 번 돌려 보고 작동 확인

곧장 스케줄러로 가지 말고, 먼저 손으로 한 번 돌립니다. 결과 파일을 두려는 워크스페이스에서 터미널을 엽니다. 제 경우는 E:\software-workspace\DeepSeek harness demo입니다.

bash
cd "E:\software-workspace\DeepSeek harness demo"   # 본인 워크스페이스로 교체
dsh --profile headless "Use the aihot skill to scrape the past 24 hours of Chinese AI hot-topic news, organize it into a brief today's AI hot-topic summary (about 5 items, each one sentence plus source), and write it to the file dsh-daily-hot.txt"

이 headless 명령을 입력한 터미널

aihot은 사용자 레벨 선반(~/.agents/skills/aihot)에 설치되어 있어 headless가 별다른 설정 없이 발견할 수 있습니다. 실행 후 5건의 오늘의 핫토픽 요약이 dsh-daily-hot.txt에 기록됩니다.

headless 실행 후 터미널에 표시된 모델의 완료 보고

실행 중에 작은 에피소드가 있었습니다. 로컬 PowerShell의 schannel이 HTTPS 핸드셰이크 도중 SEC_E_NO_CREDENTIALS를 보고했습니다 (샌드박스에서 TLS 자격증명 없음). dsh는 멈추지 않았고, 모델이 자동으로 OpenSSL 채널로 전환해 요청을 마쳤습니다 (구체적으로는 Node 또는 Python을 사용하며, 당시 판단에 따라 다릅니다). 데이터는 정상적으로 가져왔습니다. 본인 컴퓨터에서 이 문제가 생길 가능성은 낮지만, 만약 생기면 TLS 채널 문제이지 데이터 소스 실패가 아니라는 점을 알아 두시면 됩니다.

2단계: 명령을 시작 스크립트로 감싸기

스케줄러가 따옴표가 들어간 긴 headless 명령을 직접 부르면 오류가 나기 쉽습니다 (따옴표 중첩, 잘못된 작업 디렉터리). 안전한 방법은 작은 스크립트를 쓰는 것이며, 스크립트가 "대상 디렉터리로 이동 → headless 실행"을 처리합니다.

예약 작업을 돌리려는 워크스페이스에 run-daily-hot.ps1을 만듭니다. 제 디렉터리는 E:\software-workspace\DeepSeek harness demo이며, 스크립트의 Set-Location은 본인 것으로 교체합니다.

powershell
Set-Location "E:\software-workspace\DeepSeek harness demo"   # 본인 워크스페이스로 교체
dsh --profile headless "Use the aihot skill to scrape the past 24 hours of Chinese AI hot-topic news, organize it into a today's AI hot-topic summary (about 5 items), and write it to the file dsh-daily-hot.txt"

먼저 이 스크립트를 손으로 실행해 (경로는 본인 것으로 교체) 명령을 직접 친 것과 효과가 같은지 확인합니다.

powershell
powershell -ExecutionPolicy Bypass -File "E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1"

3단계: 시스템 스케줄러에 인계

Windows에는 "작업 스케줄러"가 내장되어 있으며, 명령줄에서는 schtasks로 작업을 만들 수 있습니다. 매일 아침 9시에 이 스크립트를 돌리게 합니다.

powershell
schtasks /Create /SC DAILY /ST 09:00 /TN "DSH Daily AI Hot" /TR "powershell -ExecutionPolicy Bypass -File \"E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1\""
매개변수의미
/SC DAILY매일 실행
/ST 09:00오전 9시
/TN작업 이름
/TR실제로 실행할 명령 (2단계의 스크립트를 부름)

만든 뒤 내일까지 기다리지 않고 한 번 검증합니다.

powershell
schtasks /Run /TN "DSH Daily AI Hot"

그런 다음 dsh-daily-hot.txt의 타임스탬프가 방금 시각으로 갱신되었는지 확인합니다.

4단계: "나에게 보내기"는 어떻게

Headless의 출력은 파일에 쓰기입니다 — 시각이 되면 매일 아침 dsh-daily-hot.txt가 그날의 최신 핫토픽이며, 워크스페이스만 열어 보면 됩니다. 이것이 무비용의 핵심 루프입니다.

휴대폰으로 푸시하고 싶다면 두 갈래 길이 더 있습니다.

  • 커뮤니티 스케줄 플러그인 설치 dsh-scheduler: cron 트리거를 지원하며, 결과를 ServerChan / DingTalk(钉钉) / Feishu(飞书) 웹훅으로 전달합니다. "알림을 받고 싶다", 즉 "직접 파일을 확인하지 않아도 된다"면 이 방법이 가장 쉽습니다.
  • 스크립트 안에서 직접 웹훅 호출: run-daily-hot.ps1의 끝에 몇 줄을 더해 파일 내용을 ServerChan (方糖/Fangtang) 같은 서비스에 POST하고 WeChat으로 푸시합니다. 예를 들면.
powershell
$content = Get-Content "E:\software-workspace\DeepSeek harness demo\dsh-daily-hot.txt" -Raw
Invoke-RestMethod -Uri "https://sctapi.ftqq.com/<your-SCKEY>.send" -Method Post -Body @{ title = "Today's AI Hot-Topics"; desp = $content }

<your-SCKEY>는 ServerChan이 발급한 키이며, ServerChan 웹사이트에 가입해 받습니다 (이것은 제3자 서비스이므로, 키를 공개 리포지터리에 적지 마십시오).

dsh에게 시키기: 한 프롬프트로 끝

앞선 단계들은 모두 손동작이었습니다. 스크립트를 쓰고, 작업을 등록하는 것까지. 사실 dsh가 이 모든 것을 스스로 할 수 있습니다 — 파일을 쓰고, 명령을 돌리고, 예약 작업을 등록할 수 있습니다. 요구사항을 분명히 하기만 하면, 한 번에 다 하고, 사용자는 검증만 합니다.

Web UI 입력창에 이 프롬프트를 그대로 보냅니다.

text
E:\software-workspace\DeepSeek harness demo 디렉터리에서 다음 두 가지를 수행해 주세요.
1. run-daily-hot.ps1 스크립트를 만듭니다. 먼저 Set-Location으로 그 디렉터리로 이동한 뒤 다음을 실행합니다.
   dsh --profile headless "Use the aihot skill to scrape the past 24 hours of Chinese AI hot-topic news, organize it into a today's AI hot-topic summary (about 5 items), and write it to the file dsh-daily-hot.txt";
2. schtasks를 사용해 DSH Daily AI Hot라는 이름의 예약 작업을 등록하고, 매일 09:00에 powershell로 이 스크립트를 실행합니다.
완료 후 한 번 손으로 트리거해 dsh-daily-hot.txt가 갱신되었는지 확인하고 결과를 알려 주세요.

모델이 직접 스크립트를 쓰고, schtasks /Create를 직접 실행하고, 검증을 직접 트리거합니다 — 대화에서 한 단계씩 진행되는 모습만 보면 됩니다.

참고: 예약 작업 생성 등 시스템 레벨 작업에는 전체 접근 권한이 필요합니다. 이 권한을 선택해 진행하기만 하면 확인 다이얼로그가 뜨지 않습니다.

Web UI 입력창에 이 프롬프트가 입력되어 있고, 권한이 Full access로 선택되었으며, 모델은 DeepSeek-V4-Flash-Vision-Exp

실행 후 모델이 자체적으로 결과를 보고합니다 — 스크립트는 자리잡았고, 예약 작업은 만들어졌으며 검증도 끝났습니다.

dsh 보고: run-daily-hot.ps1이 존재하며 내용이 맞고, 예약 작업 DSH Daily AI Hot가 만들어져 검증됨 (schtasks /Query: Status Ready), 하단에 그 라운드의 전체 실행 통계가 함께 표시됨

흔한 함정

함정회피법
예약 작업이 잘못된 디렉터리에서 실행됨스케줄러 환경에서 headless의 작업 디렉터리는 사용자가 통제할 수 없다. 스크립트에서 Set-Location을 먼저 한 뒤 실행한다
명령이 너무 길고 / 따옴표 중첩 오류명령을 .ps1 스크립트로 감싸고, 스케줄러는 스크립트만 부른다
공식 Schedule이 "매일 정시에 실행"할 수 있다고 생각함세션 내 리마인더만 하며 캘린더 규칙은 없다. 정시 작업 실행은 headless + 스케줄러를 쓴다
headless가 TLS 핸드셰이크 오류를 보고함schannel 채널 문제이며, 모델이 OpenSSL로 대체한다. 일반적으로 결과에 영향을 주지 않는다
예약 작업이 API 할당량을 소모함너무 빡빡하게 예약하지 않는다. 하루 한 번이면 부담이 없다

이번 장에서 배운 것

다음 항목들을 스스로 완수할 수 있으면 합격입니다.

  • [ ] 공식 Schedule (세션 내 리마인더)과 시스템 레벨 자동화 (headless + 스케줄러)의 차이를 분명히 말할 수 있다
  • [ ] dsh web --patch apps/cli/config/examples/schedule/cordis.yml로 Schedule을 켜는 법을 알고, 그 경계 (외부 알림 없음, 캘린더 규칙 없음)를 말할 수 있다
  • [ ] headless 명령으로 aihot이 핫토픽을 스크레이핑해 파일에 쓰게 하는 법을 안다
  • [ ] 명령을 .ps1 스크립트로 감싸고, schtasks로 예약 작업을 만들어 손으로 트리거해 검증하는 법을 안다
  • [ ] "나에게 보내기"의 두 가지 진보적 방법을 안다: 커뮤니티 웹훅 플러그인 / 스크립트에서 직접 ServerChan 호출

Open Source · MIT · Community Driven