
【제9회】Hermes Agent가 아침부터 말을 걸어온다──Dashboard로 매일 아침의 정형화된 태스크를 맡기기
요약
Hermes Agent의 Cron 기능을 활용하여 정해진 시간에 자동으로 태스크를 수행하는 방법을 다룹니다. Web Dashboard를 통해 복잡한 cron 식 없이도 뉴스 요약 및 Telegram 전송과 같은 정형화된 업무를 예약할 수 있습니다.
핵심 포인트
- Hermes Agent에 Cron 기능을 추가하여 수동적 상태에서 능동적 상태로 전환
- Web Dashboard를 통해 GUI 환경에서 간편하게 작업(Job) 생성 및 관리 가능
- 매일 아침 뉴스 요약 및 SNS 화제 전달 등 정형화된 업무 자동화 구현
목차
- 이번 회차의 도달점
- Cron이란 무엇인가
- 제9회 종료 시점의 구성도
- 사전 준비
- 스케줄 형식의 기본
- Dashboard에서 첫 번째 Cron 잡(Job) 만들기
- 나중에 수정하기──편집 모달(Modal)
- 프롬프트(Prompt)는 한 통의 의뢰서로서 작성하기
- 공식이 제시하는 5가지 실용 패턴
- 두 번째 이후의 잡(Job) 예시
- 보충: 터미널에서 직접 등록하기
- 요약 및 제10회 예고
- 자주 발생하는 에러와 대처법
- 조작 빠른 참조표
- 공식 문서 인용처
제6회에서 systemd 상주가 완성되었고, 제7회에서 Hermes Desktop, 제8회에서 Web Dashboard라는 관제실이 갖춰졌다. 여기까지를 통해 에이전트(Agent)는 VPS 위에서 24시간 동작하며, 브라우저와 데스크톱 앱 양쪽에서 다룰 수 있는 상태가 되었다. 다만, 아직은 "우리가 말을 걸면 대답을 하는" 수동적인 상태이다.
제9회에서는 여기에 "스스로 움직이는 것"을 추가한다. Hermes Agent의 Cron 기능을 사용하여, 예를 들어 매일 아침 7시에 오늘의 뉴스와 X(구 Twitter) 상의 화제를 요약하여 Telegram으로 보내는 것과 같은 정형화된 업무를 맡긴다. 설정은 모두 제8회에서 익숙해진 Dashboard 안에서 완결된다. 새로운 모달(Modal)이 "매일", "매주"와 같은 선택지를 제공하므로, 우선 cron 식을 직접 쓸 필요는 없다 (편집 모달에서 나중에 세밀하게 수정하고 싶을 때만 cron 식을 읽는 법이 유용하게 쓰인다).
시리즈의 전체 모습은 다음과 같다.
- 제1회──Hermes Agent를 VPS로 맞이하기──계약부터 최소 구성 로그인까지
- 제2회──Hermes Agent의 입구를 세계로부터 숨기기──Tailscale로 공개 SSH 닫기
- 제3회──Hermes Agent의 비밀을 파일에 남기지 않기──1Password로 참조만 전달하기
- 제4회──Hermes Agent 본체를 VPS에 넣기──Docker 샌드박스(Sandbox)로 격리하기
- 제5회──Grok OAuth와 Discord 추가하기──승인 모드 확인
- 제6회──systemd 상주화로 24시간 구동하기
- 제7회──Hermes Desktop으로 마우스 조작하기
- 제8회──Hermes Agent를 브라우저 관제실에서 조종하기──Web Dashboard로 설정 시각화하기
제9회(본 기사)──Dashboard로 매일 아침의 정형화된 태스크를 맡기기 - 제10회──Skills에 절차를 학습시키기
- 제11회──Hermes Agent가 최신 정보를 스스로 가져오기──웹 검색과 X 검색을 구분하여 사용하기
직접 해보는 것은, 제8회에서 북마크한 Dashboard URL을 열고, "CRON" 페인(Pane)의 "생성" 버튼을 눌러 새로운 잡(Job)을 하나 등록하는 것뿐이다. SSH로 터미널을 열 필요는 없다.
이번 회차의 도달점
제8회 완료 시점과 제9회 완료 후의 차이점을 표로 나타낸다.
| 항목 | 제8회 완료 시점 | 제9회 완료 후 |
|---|---|---|
| 상주 | systemd를 통한 gateway+dashboard로 24시간 동작 | 변함없음 |
| ... | 정해진 시간에 스스로 업무를 시작함 (능동) | |
| 정형 작업 | 매번 직접 "뉴스 요약해줘"라고 입력할 필요 있음 | 매일 아침 7시에 자동으로 Telegram으로 전달 |
| 잡(Job) 관리 | 해당 기능 없음 | Dashboard의 CRON 페인에서 목록 확인·편집·정지·재개·삭제 |
한마디로 요약하면 "Hermes에게 매일 정해진 용건을 심어두어, 자는 동안 처리하게 만드는" 회차이다.
Cron이란 무엇인가
Hermes의 Cron은 Linux에 오래전부터 있던 crontab과는 별개다. 역할이 다르다.
- systemd (제6회): 서비스를 계속 유지하는 역할. 프로세스가 멈춰도 다시 깨움
- Hermes Cron (제9회): 정해진 시간에 에이전트(Agent)를 깨워 프롬프트(Prompt)를 주고, 결과를 지정된 채팅으로 보내는 역할
즉, systemd가 "사람을 계속 고용하는 것"이라면, Cron은 "그 사람에게 매일 아침의 업무를 할당하는 것"이라는 이미지다.
이 회차에서 등장하는 용어를 미리 익혀두자.
| 용어 | 의미 | 비유 |
|---|---|---|
| Cron (크론) | 「정해진 타이밍에 자동으로 무언가를 실행하는 메커니즘」의 통칭 | 알람 시계 설정 목록 |
| cron 식 | 분 시 일 월 요일의 5개 필드로 시간을 나타내는 서식. 0 9 * * * = 매일 9시 0분 | 「매주 월요일 9시」를 나타내는 업계 공통 포맷 |
| 배신처 (Delivery Target) | 작업(Job)의 결과를 어디로 보낼지 지정. 로컬/Telegram/Discord/Slack/Email의 5가지 선택지 | 택배를 집으로 받을지 사무실로 받을지의 선택 |
| self-contained prompt | 과거의 대화를 기억하지 못한다는 전제하에, 모든 내용을 다 써 내려간 의뢰문 | 초면인 사람에게 부탁할 생각으로 모든 것을 설명하는 의뢰서 |
| 즉시 실행 (Run Now) | 작업 행의 번개 아이콘. 다음 tick에서 실행됨 = 실제 기기에서는 2~3분 후에 Telegram으로 도착함 | 알람의 「테스트 울림」 버튼 |
[SILENT] | 에이전트의 최종 응답에 이 단어가 포함되어 있으면, 해당 회차의 전송이 중단됨 | 「변화가 있을 때만 알려줘」 설정 |
제9회 종료 시점의 구성도
Cron 작업은 제6회에서 상주(Resident)시킨 Hermes Agent 안에 등록된다. VPS의 파일을 직접 편집하는 것이 아니라, 제8회의 Dashboard 「생성 (Create)」 모달에서 등록한다. 결과의 배신처로서 Telegram 등을 지정한다.

포인트는 등록한 후에는 아무것도 하지 않아도 된다는 것이다. VPS가 작동하는 한, 매일 아침 알아서 실행되어 결과가 도착한다.
사전 준비
제8회까지 완료되었다면 추가로 설치할 것은 없다. Dashboard는 제7회에서 systemd로 상주시켜 두었으므로, 브라우저에서 URL을 열기만 하면 된다.
http://<tailscale-ip>:9119 # 제7-8회에서 설정한 dashboard의 URL
# ID/password는 기본 인증 (Basic Authentication, 제7회)
열었다면, 사이드바 하단의 「게이트웨이 상태: 실행 중」과 Telegram bot에게 말을 걸었을 때 답장이 오는 상태(제4회 완료)를 확인해 둔다.
스케줄 서식의 기본
Cron 작업의 「언제 실행할 것인가」는 공식 가이드가 제시하는 4가지 서식으로 표현할 수 있다.
| 서식 | 예시 | 의미 | 적합한 용도 |
|---|---|---|---|
| cron 식 | 0 7 * * * | 매일 7시 0분 | 매일·매주 등 정기적 작업 |
| interval (간격) | every 2h | 2시간마다 | 일정 간격의 모니터링 |
| relative delay (상대적 지연) | 30m | 지금으로부터 30분 후에 1회 | 테스트·단발성 작업 |
| ISO timestamp | 2026-06-01T09:00:00+09:00 | 지정된 일시에 1회 | 미래의 특정 시점 1회 |
읽는 법이 유용하게 쓰이는 곳은 나중에 볼 편집 모달(EDIT JOB)에서 스케줄을 직접 수정할 때다. 신규 모달에서는 「매일」, 「매주」와 같은 선택지에서 고르기만 하면 되므로, 여기서는 우선 한 장의 표로 전체상을 파악해 두자.

*는 「모두 (All)」를 의미한다. 0 7 * * *라면 「일·월·요일에 상관없이 매일 7시 0분」이 된다. 다음 장에서 보듯이, Dashboard의 신규 모달에서는 이 식을 직접 쓸 필요는 없다. cron 식은 「내부 표현」으로서 백그라운드에서 생성된다.
Dashboard에서 첫 번째 Cron 작업 만들기
예시로 「매일 아침 7시에, 오늘의 뉴스와 X(구 Twitter) 상의 화제를 요약하여 Telegram으로 전달하는」 작업을 만든다.
CRON 패널을 열고 「생성 (Create)」을 누른다
왼쪽 사이드바에서 「CRON」을 선택한다. 패널의 헤더는 「Cron」이며, 그 아래에 「예약된 작업 (Scheduled Jobs) (N)」과 현재 등록 수가 표시된다. 오른쪽 상단의 크림색 버튼이 「생성 (Create)」이다.

「생성 (Create)」을 누르면 브라우저 내에 새로운 작업을 만드는 모달이 열린다.
모달의 각 항목 채우기
모달의 타이틀은 「새로운 CRON 작업 (New CRON Job)」이다. 항목은 위에서부터 순서대로 나열된다.

| 항목 | 입력할 값 |
|---|---|
| PROFILE | default 그대로 |
| 이름 (선택 사항) | morning-news |
| 프롬프트 (Prompt) | 다음 절의 self-contained 프롬프트 전문 |
| 스케줄 (Schedule) | 「매일 (Daily)」 선택 (아래 해설 참조) |
| ... | Telegram (제8회에서 Telegram을 활성화했다면 드롭다운에 나타남) |
스케줄(Schedule) 칸은 초기 표시 시 「반복 간격 (Repeating Interval)」 모드로 되어 있으나, 드롭다운을 열면 6개의 모드가 나열된다.

「매일 (Daily)」을 선택하면 「시각 (Time)」 칸이 나타나며, 시계 아이콘이 있는 입력란에 07:00을 입력한다. 전송 대상으로 「Telegram」을 선택해 둔다.
여기까지 채우면, 모달 하단의 작은 녹색 글씨로 「전송 형식: 0 7 * * *」라는 프리뷰가 나타난다. 이것이 선택한 모드와 값으로부터 자동 생성되는 cron 식이다. 독자는 외울 필요가 없다.

프롬프트 예시 (self-contained)
모달의 「프롬프트 (Prompt)」 칸에 넣을 문장. 자세한 작법은 「프롬프트는 한 통의 의뢰서로서 작성한다」 장에서 다룬다. 본 기사에서는 Web 검색만으로 완결되는 소박한 예시를 들고 있다. X 검색을 포함한 버전은 제11회에서 다룬다.
오늘의 뉴스와 X상의 AI 관련 화제를 요약해줘.
요약은 3~5개 항목, 각 2줄 이내로.
출처 URL을 반드시 첨부할 것.
최신성을 우선할 것. 24시간 이내의 정보만.
...
「작성 (Create)」을 눌러 목록에 추가
모달 우측 하단의 「작성 (Create)」 버튼을 누르면 모달이 닫히고 CRON 페인의 목록에 morning-news가 추가된다.

각 행의 구성은 다음과 같다.
- 상단: 이름 (
morning-news)과 배지 3개 (scheduled/default/telegram) - 중단: 프롬프트 요약
- 하단: 스케줄의 일본어 표시 「매일 07:00」과 「이전 …」 「다음 …」 타임스탬프
- 우측 끝: 액션 아이콘 4개 (왼쪽부터 ⏸ 일시정지 / ⚡ 지금 실행 / ✏ 편집 / 🗑 삭제)
번개 아이콘으로 즉시 테스트하기
내일 아침 7시를 기다리지 않아도 즉시 동작 확인을 할 수 있다. morning-news 행의 우측 끝, 액션 아이콘 중 두 번째에 있는 번개(⚡)가 「지금 실행 (Run Now)」이다.

「지금 실행」이라고 적혀 있지만, 누르는 순간 바로 실행되는 것은 아니다. 내부적으로는 「다음 scheduler tick에서 실행한다」는 예약이 되며, 에이전트가 Web 검색이나 기사 본문 취득에 시간을 사용하기 때문에 Telegram에 도착하는 것은 2~3분 후다. 가만히 기다린다.
잠시 후, 제4회에서 연결한 Telegram 봇으로 요약 내용이 도착한다.

확인해야 할 사항은 다음과 같다.
- 항목이 3~5건으로 나오고 있는가
- 각 항목에 출처 URL이 붙어 있는가
- 말미에 「궁금한 토픽이 있다면 더 깊이 파고들어 보세요」가 포함되어 있는가
이것으로 제6회에서 상주시킨 Hermes에게 매일 아침 7시의 업무를 하나 가르쳐준 셈이 된다.
나중에 수정하기──편집 모달 (Edit Modal)
self-contained 프롬프트로 운용하다 보면, 스케줄을 바꾸고 싶거나 프롬프트에 주의사항을 추가하고 싶은 상황이 반드시 발생한다. 그때의 수정 방법을 미리 알아두자. Dashboard의 **편집 모달 (EDIT JOB)**이 이를 안전하게 수정하는 장소다.
신규 작성 모달과는 별개의 UI로, 입력란이 4개로 압축되어 있다. 스케줄은 CRON 식의 자유 입력 방식으로 전환되어, 30 6 * * *와 같이 직접 작성할 수 있다.
스케줄을 다시 쓰기
예시로, 작업(Job)의 시각을 아침 7시에서 아침 6시 30분으로 바꿔보자. morning-news 행의 연필(✏)을 누르면 EDIT JOB 모달이 열린다.

스케줄 칸을 0 7 * * *에서 30 6 * * *로 다시 쓰고, 「SAVE CHANGES」를 누른다. CRON 페인 목록으로 돌아오면 morning-news의 스케줄 표시가 「매일 07:00」에서 「매일 06:30」으로 바뀌어 있다.

여기서 스케줄 형식의 기본에서 보았던 그림이 그대로 도움이 된다. 신규 작성 모달에서는 「매일」, 「시각 피커 (Time Picker)」로 충분했지만, 편집 모달에서는 30 6 * * *를 읽고 쓸 수 있어야 한다. Dashboard는 「처음에는 쉽게, 나중에는 세밀하게」라는 이단계 구조로 되어 있다.
프롬프트에 깨달은 주의사항 추가하기
몇 번 받아보고 깨달은 주의사항을 프롬프트 말미에 추가한다. 예를 들어,
- 좋아요/RT 등의 수치는 적지 말 것 (실제로는 취득하지 않으므로 날조가 됨)
- 출처 URL이 붙지 않는 항목이 가끔 있음 → 「반드시 첨부할 것」이라고 명시
동일한 EDIT JOB 모달을 열어 프롬프트 칸 말미에 한 줄씩 추가하고 「SAVE CHANGES」를 누른다.

이 「알아차리면 한 줄씩 추가해 나가는」 운용 방식은 제10회에서 다룰 Skills 설계와 직결되는 이야기다. 프롬프트 안에서 전부 다 써 내려가는 지금의 방식은 작업(Job)이 늘어날수록 유지보수가 힘들어지게 된다. 제10회에서는 이 절차 자체를 「Skill」로 독립시켜, 새로운 Cron의 프롬프트 칸을 짧은 호출로 대체할 것이다.
일시 정지 및 재개·삭제
EDIT JOB 옆에는 또 다른 3개의 아이콘이 있다.
- ⏸ 일시 정지: scheduled 상태인 작업을 멈춘다. 정지 중에는 이 아이콘이 재개 아이콘으로 바뀐다.
- ⚡ 즉시 실행: 「번개 아이콘으로 즉시 테스트하기」에서 사용했던 즉시 실행 기능.
- 🗑 삭제: 작업을 삭제한다.
morning-news의 일시 정지 아이콘(⏸)을 누르면 행의 배지가 scheduled에서 paused로 바뀌고, 오른쪽 상단에 「일시 정지: "MORNING-NEWS"」라는 토스트(Toast) 메시지가 나타난다.

정지 중인 행의 재개 아이콘을 누르면 배지가 scheduled로 돌아오며, 오른쪽 상단에 「재개: "MORNING-NEWS"」 토스트가 나타난다. 다음 실행 시각도 복구된다.

삭제 아이콘(🗑)도 같은 위치에 있다. 실수로 지우면 작업 자체가 사라지므로, 나중에 복구할 수 있는 「일시 정지」와 구분해서 사용한다.
프롬프트는 한 통의 의뢰서로서 작성한다
Cron 작업에서 가장 중요한 요령이다. Cron으로 실행될 때, 에이전트(Agent)는 완전히 새로운 대화(Fresh conversation) 상태로 동작한다. 전날의 대화 내용도, 평소의 말투도, 과거의 보정 사항도 무엇 하나 이어받지 않는다. 따라서 프롬프트 안에서 모든 것을 명시해야 한다. 이를 self-contained (자기 완결적) 프롬프트라고 부른다.
잘못된 예
평소처럼 뉴스 요약을 해줘.
에이전트는 「평소처럼」이 무엇인지 모른다. 어떤 뉴스인지, 몇 항목인지, 출처가 필요한지 등 모든 것이 불분명한 상태로 동작하게 된다.
좋은 예
X상에서 최근 논의되고 있는 AI 관련 화제를 5건 선정하고,
각 게시물을 2줄로 요약할 것. 작성자 핸들과 게시물 URL을 반드시 포함할 것.
마지막에는 "관심이 있다면 답장해 주세요. 원문을 인용하여 논점을 정리하겠습니다"라고 적을 것.
무엇을, 언제의 데이터로, 몇 건을, 어떤 포맷으로, 출처는 어떻게 붙일지, 마지막 문구까지 전부 지정되어 있다. 이 방식이라면 매일 아침 동일한 품질로 결과를 받아볼 수 있다.
[SILENT]
변화가 있을 때만 알림을 받는다 (감시 계열의 작업에서 매번 알림이 오면 금방 마비되어 읽지 않게 된다. 이때 [SILENT]를 사용한다. 프롬프트 안에서 "변화가 없다면 최종 응답을 [SILENT]로만 해줘"라고 지시하면, 에이전트의 최종 응답에 [SILENT]가 포함된 회차는 전송이 중단된다 (공식 설명: "When the agent's final response contains [SILENT], delivery is suppressed").
감시 대상 페이지를 열어서 이전과의 차이점을 확인해줘.
변화가 있다면 무엇이 어떻게 바뀌었는지 3줄로 요약해서 보고해.
변화가 없다면, 최종 응답을 [SILENT]라는 한 단어로만 작성할 것.
가격 감시, 사이트 업데이트 체크, 리포지토리(Repository) 워치(Watch) 등 「변했을 때만 알려줬으면 하는」 용도에 효과적이다.
공식이 제시하는 5가지 실용 패턴
공식 가이드는 Cron의 활용 사례로 5가지 패턴을 들고 있다.
| 패턴 | 용도 | 스케줄 예시 | 비고 |
|---|---|---|---|
| 1. Website Monitoring | 사이트 내용을 가져오고, 변화가 있으면 알림 | every 1h | 프롬프트 말미에 [SILENT] 병용 |
| 2. Weekly Reports | 여러 소스(Web 검색/GitHub 등)를 집약하여 리포트 | 0 9 * * 1 (월요일 9시) | — |
| 3. Repository Watcher | gh 명령어로 GitHub의 issue/PR/release를 감시 | every 4h | — |
| 4. Data Collection Pipeline | 정기적인 데이터 수집, 경향 분석, 이상 탐지 | 0 */6 * * * (6시간마다) | — |
| 5. Multi-Skill Workflows | 여러 Skill을 연결 (논문 검색 → 저장 등) | 0 22 * * * (매일 밤 22시) | 제10회에서 다룸 |
본 기사의 「매일 아침 뉴스 요약」은 패턴 2(Weekly Reports)를 매일 단위로 축소한 간이 버전에 해당한다. 패턴 5의 Skill 연계는 제10회에서 다룬다.
두 번째 이후의 작업(Job) 예시
작업(Job)이 하나뿐이라면 「24시간 구동하는 의미」를 실감하기 어렵다. 두 번째 작업을 추가하여, 하루에 2번 에이전트가 스스로 말을 거는 상태로 만들어 보자. 방법은 3장과 동일하게, CRON 페인의 「작성」을 누르고 모달(Modal)을 채우기만 하면 된다.
예: 오후 17시의 「내일의 날씨와 쓰레기 배출 예정」
쓰레기 배출 규칙은 시구정촌(市区町村)마다 다르므로, 프롬프트(Prompt) 안에 자신의 시구정촌 명칭과 수거 요일까지 구체적으로 적는다. 에이전트는 거주지를 모르기 때문에, 이 부분도 self-contained하게 모두 작성한다.
| 모달 항목 | 입력할 값 |
|---|---|
| 이름 (선택) | evening-tomorrow |
| 스케줄 | 「매일」 + 시각 17:00 |
| 전달 대상 | Telegram |
| 프롬프트 | 「내일 도쿄도 세타가야구의 날씨(강수 확률, 최고·최저 기온)를 한 줄로. 아울러, 세타가야구의 쓰레기 수거 규칙(타는 쓰레기는 월·목, 페트병은 수요일)에 비추어 내일이 무슨 수거일인지 알려줘. 마지막에 『내일 예정 확인을 도와드릴까요?』를 덧붙여줘.」 |
예시의 「세타가야구」와 수거 요일은 자신의 시구정촌과 실제 규칙으로 교체한다. 실제로 등록하여 구동하면, Telegram으로 다음과 같은 메시지가 도착한다.

예: 매주 금요일 23시의 「이번 주 회고 프롬프트」
| 모달 항목 | 입력할 값 |
|---|---|
| 이름 (선택) | friday-reflection |
| 스케줄 | 「커스텀 (cron 식)」 + 0 23 * * 5 |
| 전달 대상 | Telegram |
| 프롬프트 | 「이번 주 회고를 촉구하는 질문을 3개 보내줘. 업무·개인·학습 각 카테고리에서 하나씩. 『답변해 주면 다음 주 우선순위 정리를 도와줄게』를 덧붙여줘.」 |
「매주 금요일」은 「매주」 모드로도 만들 수 있지만, cron 식에 익숙하다면 「커스텀 (cron 식)」 모드에서 0 23 * * 5라고 직접 작성해도 된다. Dashboard는 양쪽 입구를 모두 제공하고 있다.
등록했다면, CRON 페인에 2건이 나란히 있는지 확인하고, 번개 아이콘으로 동작을 지켜본다. 하루에 2번, 에이전트가 스스로 말을 걸게 된다.
보충: 터미널에서 직접 등록하기
SSH 터미널에서 직접 등록하고 싶은 사람을 위한 대체 절차. Dashboard의 「작성」 모달에서 채운 내용과 결과는 동일하게 ~/.hermes/config.yaml에 기록된다. 양쪽 모두 사용해도 된다 (동일한 파일을 공유하므로 충돌하지 않는다).
# VPS에 SSH 접속 (제1~2회에서 설정한 Tailscale 경유)
ssh -i ~/.ssh/hermes_vps_ed25519 admin@hermes-vps
# 한 줄 명령어로 등록 (스케줄·프롬프트·이름·전달 대상)
...
등록 시 반환되는 job_id (예: 8f74025f300e)가 이후 조작에서 대상을 지칭하는 ID가 된다. Dashboard에서 만든 작업(Job)도 CLI의 hermes cron list에 똑같이 나열되므로, 편한 쪽을 사용하면 된다.
요약 및 제10회 예고
제9회에서 수행한 내용.
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기