본문으로 건너뛰기

Cron으로 모든 것을 자동화하기

일일 브리핑 봇 튜토리얼에서는 기본 사항을 다룹니다. 이 가이드에서는 더 나아가 자신의 워크플로에 맞게 조정할 수 있는 5가지 실제 자동화 패턴을 설명합니다.

전체 기능 참조는 예약된 작업(Cron)을 참조하세요.

핵심 개념

Cron 작업은 현재 채팅에 대한 기억 없이 새로운 에이전트 세션에서 실행됩니다. 프롬프트는 완전히 독립적이어야 하며 에이전트가 알아야 할 모든 내용을 포함해야 합니다.

LLM이 필요 없다면 no-agent 모드를 사용하세요

스크립트가 보낼 정확한 메시지(메모리 경고, 디스크 경고, CI 핑, 하트비트)를 이미 생성하는 반복 감시 작업에는 스크립트 전용 크론 작업을 사용해 LLM을 완전히 건너뛰세요. 토큰을 쓰지 않으면서 같은 스케줄러를 사용할 수 있습니다. 채팅에서 Hermes에게 설정을 요청해도 됩니다. cronjob 도구는 언제 no_agent=True를 선택해야 하는지 판단하고 스크립트를 작성합니다.


패턴 1: 웹사이트 변경 모니터

URL을 확인하고 변경 사항이 있을 때만 알림을 받습니다.

여기서 핵심은 script 매개변수입니다. Python 스크립트는 각 실행 전에 실행되고, 그 stdout이 에이전트의 컨텍스트가 됩니다. 스크립트는 가져오기와 비교 같은 기계적인 작업을 처리하고, 에이전트는 “이 변경이 중요한가?” 같은 판단을 맡습니다.

모니터링 스크립트를 만듭니다.

mkdir -p ~/.hermes/scripts
import hashlib, json, os, urllib.request

URL = "https://example.com/pricing"
STATE_FILE = os.path.expanduser("~/.hermes/scripts/.watch-site-state.json")

# 현재 콘텐츠 가져오기
req = urllib.request.Request(URL, headers={"User-Agent": "Hermes-Monitor/1.0"})
content = urllib.request.urlopen(req, timeout=30).read().decode()
current_hash = hashlib.sha256(content.encode()).hexdigest()

# 이전 상태 로드
prev_hash = None
if os.path.exists(STATE_FILE):
with open(STATE_FILE) as f:
prev_hash = json.load(f).get("hash")

# 현재 상태 저장
with open(STATE_FILE, "w") as f:
json.dump({"hash": current_hash, "url": URL}, f)

# 에이전트에 전달할 출력
if prev_hash and prev_hash != current_hash:
print(f"CHANGE DETECTED on {URL}")
print(f"Previous hash: {prev_hash}")
print(f"Current hash: {current_hash}")
print(f"\nCurrent content (first 2000 chars):\n{content[:2000]}")
else:
print("NO_CHANGE")

크론 작업을 설정합니다.

/cron add "every 1h" "스크립트 출력에 CHANGE DETECTED가 있으면 페이지에서 무엇이 바뀌었고 왜 중요할 수 있는지 요약하세요. NO_CHANGE가 있으면 [SILENT]만 응답하세요." --script ~/.hermes/scripts/watch-site.py --name "가격 모니터" --deliver telegram
[SILENT] 활용

에이전트의 최종 응답에 [SILENT]가 포함되면 전달이 억제됩니다. 실제로 어떤 일이 발생했을 때만 알림을 받고, 변화가 없는 시간에는 불필요한 메시지가 오지 않습니다.


패턴 2: 주간 보고서

여러 소스의 정보를 정리된 요약으로 묶습니다. 일주일에 한 번 실행되며 홈 채널로 전송됩니다.

/cron add "0 9 * * 1" "다음을 포함하는 주간 보고서를 작성하세요:

1. 지난주 주요 AI 뉴스 5개를 웹에서 검색
2. GitHub에서 'machine-learning' 토픽의 트렌딩 저장소 검색
3. Hacker News에서 가장 많이 논의된 AI/ML 게시물 확인

각 소스별 섹션이 있는 깔끔한 요약으로 작성하세요. 링크를 포함하세요.
500단어 이하로 유지하고 중요한 내용만 강조하세요." --name "주간 AI 다이제스트" --deliver telegram

CLI에서:

hermes cron create "0 9 * * 1" \
"주요 AI 뉴스, 트렌딩 ML GitHub 저장소, HN에서 가장 많이 논의된 게시물을 포함하는 주간 보고서를 작성하세요. 섹션별로 구성하고 링크를 포함하며 500단어 이하로 유지하세요." \
--name "주간 AI 다이제스트" \
--deliver telegram

0 9 * * 1은 표준 cron 표현식입니다: 매주 월요일 오전 9시.


패턴 3: GitHub 저장소 감시자

새 이슈, PR 또는 릴리스가 있는지 저장소를 모니터링합니다.

/cron add "every 6h" "GitHub 저장소 NousResearch/hermes-agent에서 다음을 확인하세요:
- 지난 6시간 동안 열린 새 이슈
- 지난 6시간 동안 열리거나 병합된 새 PR
- 새 릴리스

터미널에서 다음 gh 명령을 실행하세요:
gh issue list --repo NousResearch/hermes-agent --state open --json number,title,author,createdAt --limit 10
gh pr list --repo NousResearch/hermes-agent --state all --json number,title,author,createdAt,mergedAt --limit 10

최근 6시간 항목만 필터링하세요. 새 항목이 없으면 [SILENT]로 응답하세요.
새 항목이 있으면 활동을 간결하게 요약하세요." --name "저장소 감시자" --deliver discord
독립적으로 실행 가능한 프롬프트

프롬프트에 정확한 gh 명령이 포함되어 있는지 확인하세요. 크론 에이전트는 이전 실행이나 기본 설정을 기억하지 않습니다. 필요한 내용을 모두 프롬프트 안에 설명해야 합니다.


패턴 4: 데이터 수집 파이프라인

정기적으로 데이터를 수집하고, 파일에 저장하고, 시간에 따른 추세를 감지합니다. 이 패턴은 스크립트(수집용)와 에이전트(분석용)를 결합합니다.

import json, os, urllib.request
from datetime import datetime

DATA_DIR = os.path.expanduser("~/.hermes/data/prices")
os.makedirs(DATA_DIR, exist_ok=True)

# 현재 데이터 가져오기(예: 암호화폐 가격)
url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"
data = json.loads(urllib.request.urlopen(url, timeout=30).read())

# 기록 파일에 추가
entry = {"timestamp": datetime.now().isoformat(), "prices": data}
history_file = os.path.join(DATA_DIR, "history.jsonl")
with open(history_file, "a") as f:
f.write(json.dumps(entry) + "\n")

# 분석을 위해 최근 기록 로드
lines = open(history_file).readlines()
recent = [json.loads(l) for l in lines[-24:]] # 최근 24개 데이터 포인트

# 에이전트에 전달할 출력
print(f"Current: BTC=${data['bitcoin']['usd']}, ETH=${data['ethereum']['usd']}")
print(f"Data points collected: {len(lines)} total, showing last {len(recent)}")
print(f"\nRecent history:")
for r in recent[-6:]:
print(f" {r['timestamp']}: BTC=${r['prices']['bitcoin']['usd']}, ETH=${r['prices']['ethereum']['usd']}")
/cron add "every 1h" "스크립트 출력의 가격 데이터를 분석하세요. 다음을 보고하세요:
1. 현재 가격
2. 최근 6개 데이터 포인트의 추세 방향(상승/하락/횡보)
3. 눈에 띄는 변동(5% 초과 변화)

가격이 횡보하고 특이 사항이 없으면 [SILENT]로 응답하세요.
큰 움직임이 있으면 무슨 일이 있었는지 설명하세요." \
--script ~/.hermes/scripts/collect-prices.py \
--name "가격 추적기" \
--deliver telegram

스크립트는 기계적 수집을 수행합니다. 에이전트는 추론 레이어를 추가합니다.


패턴 5: 다중 스킬 워크플로

복잡한 예약 작업에서는 여러 스킬을 함께 연결할 수 있습니다. 프롬프트가 실행되기 전에 스킬이 순서대로 로드됩니다.

# arxiv 스킬로 논문을 찾고 obsidian 스킬로 노트를 저장합니다.
/cron add "0 8 * * *" "지난 하루 동안 'language model reasoning'에 관한 가장 흥미로운 논문 3편을 arXiv에서 검색하세요. 각 논문마다 제목, 저자, 초록 요약, 핵심 기여를 담은 Obsidian 노트를 만드세요." \
--skill arxiv \
--skill obsidian \
--name "논문 다이제스트"

도구에서 직접:

cronjob(
action="create",
skills=["arxiv", "obsidian"],
prompt="지난 하루 동안 'language model reasoning'에 관한 논문을 arXiv에서 검색하세요. 상위 3개를 Obsidian 노트로 저장하세요.",
schedule="0 8 * * *",
name="논문 다이제스트",
deliver="local"
)

스킬은 순서대로 로드됩니다. 먼저 arxiv(에이전트에게 문서 검색 방법을 가르칩니다), 그 다음 obsidian(메모 작성 방법을 가르칩니다). 프롬프트는 그것들을 하나로 묶습니다.


작업 관리

# 모든 활성 작업 나열
/cron list

# 작업 즉시 실행(테스트용)
/cron run <job_id>

# 작업을 삭제하지 않고 일시 중지
/cron pause <job_id>

# 실행 중인 작업의 일정 또는 프롬프트 수정
/cron edit <job_id> --schedule "every 4h"
/cron edit <job_id> --prompt "수정된 작업 설명"

# 기존 작업에 스킬 추가 또는 제거
/cron edit <job_id> --skill arxiv --skill obsidian
/cron edit <job_id> --clear-skills

# 작업 영구 삭제
/cron remove <job_id>

전달 대상

--deliver 플래그는 결과의 위치를 제어합니다.

대상사용 사례
origin--deliver origin작업을 생성한 동일한 채팅(기본값)
local--deliver local로컬 파일에만 저장
telegram--deliver telegram사용자의 텔레그램 홈 채널
discord--deliver discordDiscord 홈 채널
slack--deliver slackSlack 홈 채널
특정 채팅--deliver telegram:-1001234567890특정 텔레그램 그룹
스레드--deliver telegram:-1001234567890:17585특정 텔레그램 주제 스레드

독립적으로 실행 가능한 프롬프트를 만드세요. 크론 작업의 에이전트는 대화 내용을 기억하지 않습니다. URL, 저장소 이름, 형식 선호도, 전달 지침을 프롬프트에 직접 포함하세요.

[SILENT]를 적극적으로 사용하세요. 작업 모니터링의 경우 항상 "변경된 사항이 없으면 [SILENT]로 응답하세요."와 같은 지침을 포함하세요. 이렇게 하면 불필요한 알림을 줄일 수 있습니다.

데이터 수집에는 스크립트를 사용하세요. script 매개변수를 사용하면 Python 스크립트가 반복적인 부분(HTTP 요청, 파일 I/O, 상태 추적)을 처리할 수 있습니다. 에이전트는 스크립트의 stdout만 보고 추론을 적용합니다. 이는 에이전트가 직접 가져오는 것보다 저렴하고 안정적입니다.

/cron run으로 테스트하세요. 일정이 트리거될 때까지 기다리기 전에 /cron run <job_id>을 사용하여 즉시 실행하고 출력이 올바른지 확인하세요.

일정 표현식. 지원되는 형식: 상대 지연(30m), 간격(every 2h), 표준 크론 표현식(0 9 * * *) 및 ISO 타임스탬프(2025-06-15T09:00:00). daily at 9am과 같은 자연어는 지원되지 않습니다. 대신 0 9 * * *을 사용하세요.


전체 크론 참조(모든 매개변수, 특수 사례 및 내부)는 예약된 작업(Cron)을 참조하세요.