TechQuant Blog

Claude Code を cron で自動実行する方法 — 毎朝届くAIレポートの仕組み

8分で読める

朝7時、スマホの通知を見ると昨晩のログ解析レポートがもう届いている。エラーの傾向、レスポンスタイムの変化、対応が必要な箇所。全部片付いている。自分は寝ていただけだ。

Raspberry Pi の上で cron が毎晩 Claude Code を叩いて、勝手にやってくれた結果がこれ。半月ほど運用してみて、もう手放せなくなった。

Claude Code の「-p」フラグ — 自動化の起点

Claude Code は普通に使うと対話型のUIが立ち上がる。ターミナルでやり取りするアレだ。便利だけど、自動化には向かない。

鍵になるのが -p フラグ。

claude -p "src/ 以下の Python ファイルで未使用の import を一覧にして"

これだけでいい。プロンプトを引数で渡すと、結果を標準出力に吐いてプロセスが終了する。セッションは残らない。つまり、シェルスクリプトや cron から呼び放題だ。

もう2つ、押さえておくオプションがある。

claude -p "$PROMPT" \
  --allowedTools "Bash,Read,Glob,Grep" \
  --max-budget-usd 1

--allowedTools は Claude Code が使えるツールの制限。自動実行で WriteEdit を許可すると、人間が見ていない間にファイルが書き換わるリスクがある。読み取り系だけに絞るのが安全だ。

--max-budget-usd は予算キャップ。これを付けないとどうなるか。後で書く。

cron + Claude Code の最小構成

Raspberry Pi 5 で実際に動かしている構成をそのまま載せる。

#!/bin/bash
# daily_report.sh — 毎晩のログ解析
source ~/config/.env
export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH"

LOG=~/logs/report_$(date +%Y%m%d).log

PROMPT="以下のログファイルを分析して、異常なパターンや
注意すべき点をMarkdownレポートにまとめて。
重要度が高い項目から順に。200行以内で。
ファイル: ~/app/logs/app.log"

timeout 600 claude -p "$PROMPT" \
  --allowedTools "Bash,Read,Glob,Grep" \
  --max-budget-usd 0.5 \
  > "$LOG" 2>&1

# 完了通知
if [ $? -eq 0 ]; then
  curl -s -X POST "$SLACK_WEBHOOK" \
    -d "{\"text\": \"日次レポート完了\"}"
fi

crontab への登録はこう。

30 23 * * * /home/pi/scripts/daily_report.sh

毎晩23:30に起動して、朝にはレポートが出来ている。

見逃しがちなのが timeout。Claude Code がプロンプトの解釈にハマって延々と走り続けることが、たまにある。600秒で打ち切れば安心。

あ、もう一つ。cron はユーザーのシェル環境を引き継がない。ANTHROPIC_API_KEY が未設定で Claude Code が起動すらしない、というのを初週に2回やった。スクリプト冒頭で source ~/.envPATH の設定は忘れずに。地味だけど、ここでハマる人は多いと思う。

自動化して効果が大きかったタスク3つ

半月の運用で「もう手でやりたくない」と感じたものを挙げる。

1. ログ解析レポート

前述の構成がそのままこれ。grep と awk でも数値は拾えるけど、Claude Code だと「前日比で異常か」「原因として何が考えられるか」まで踏み込んでくれる。精度は思った以上に高い。

ただしログが巨大だと途中で止まる。tail -2000 で直近分に絞ってから渡すのがコツ。全ログを食わせた日は budget 上限に当たって、中途半端なレポートが出てきた。

2. 依存パッケージの脆弱性チェック

PROMPT="pip audit と npm audit を実行して、
対応が必要なものだけ緊急度(高/中/低)付きで
リストにまとめて。30行以内で。"

pip auditnpm audit の生出力を毎日読むのはしんどい。「今日やるべきもの」だけ抜き出してくれるのが地味にありがたい。週1回くらい「高」が検出されて、そのたびに助かっている。

3. git diff のデイリーサマリ

git log --since="yesterday" --oneline の結果を渡して、昨日のコード変更サマリを作る。コミットメッセージだけだと分からない変更の意図や影響範囲まで補足してくれるのがいい。

チームで開発していると全PRを追いきれない日がある。朝イチのダイジェストは想像以上に重宝する。

踏んだ地雷と、そこから学んだこと

いいことばかり書いてもフェアじゃないので、失敗談も正直に。

timeout 未設定で一晩放置。運用初日にやらかした。「全ログを詳細に分析して」という雑なプロンプトで夜中に走らせたら、翌朝まだ動いていた。APIの利用額を見て冷や汗をかいた。$3くらいで済んだから良かったものの、--max-budget-usdtimeout の二重ガードは外せない。

出力の肥大化。「全行を解説して」みたいなプロンプトだと出力が1万行を超えることがある。プロンプトに「200行以内」「要点のみ」と明記するだけで解決した。LLMへの指示は出力の形式と量まで指定するのが鉄則だと改めて感じた。

Raspberry Pi のメモリ。Claude Code 自体は Node.js ベースなのでプロセスはそこまで重くないが、Pi 4 の 2GBモデルだとスワップが発生して遅い。Pi 5 の 8GB なら問題ない。ここは正直まだベストな構成を探っている途中。4GBモデルでも動くには動くけど、余裕があるとは言えない。

コストの現実 — 月いくらかかるか

一番気になるところだと思う。実数値を出す。

自分の構成は1日3タスク、各 --max-budget-usd 0.5。実測で1タスクあたり $0.05〜$0.30 に収まっている。日によってバラつきはあるけど、平均 $0.40/日くらい。

タスク頻度1回あたり月額目安
ログ解析毎日$0.10〜0.25$3〜8
パッケージチェック週1$0.05〜0.15$0.2〜0.6
diff サマリ毎日$0.05〜0.20$1.5〜6
合計$5〜15

月 $10 前後。日本円で1,500円くらい。毎朝30分の定型作業がなくなったと考えれば、悪くない投資だと思う。

ちなみに Claude Max プラン(月額 $100 or $200)に入っていればAPI利用分がプランに含まれるので、cron 実行分の追加課金はゼロになる。タスクを増やすなら Max のほうが得になるラインは確実にある。

始めるなら、まず1タスクから

最小ステップはこれだけ。

  1. Claude Code をインストール: npm install -g @anthropic-ai/claude-code
  2. APIキーを設定: export ANTHROPIC_API_KEY=sk-ant-xxx
  3. ワンショット実行を試す: claude -p "Hello"
  4. シェルスクリプトに包む(timeout + budget上限 + ログ出力)
  5. 手動実行で動作確認
  6. crontab -e で登録
  7. 翌朝、ログを確認する

いきなり5個も6個も自動化しようとしないほうがいい。1つが安定してから次を足す。自分もログ解析だけで1週間回して、安定を確認してから2つ目を追加した。このペースが一番確実だった。

地味な仕組みだけど、毎朝の30分が消えるインパクトは大きい。cron を書いたことがある人なら、30分もあれば最初の自動化が動くはず。