Claude Codeの定期実行|cron設定と3つの落とし穴
Claude Codeの定期実行を、cronで自動化できたら便利だと思いませんか。
「毎朝フォルダを整理してほしい」「毎週レポートの下書きを作ってほしい」。こうした作業は、時刻を決めて自動で動かせると手間が減ります。
ただ、cronに近い環境からClaude Codeを呼んでみると、手で実行したときには起きないつまずきが3つありました。この記事では、その結果とDesktopアプリのスケジュールタスクとの使い分けを紹介します。
※仕様・オプションは2026年10月28日時点、Claude Code CLI 2.1.268・macOSで確認したものです。WindowsやLinuxでは手順が異なります。
結論:まずDesktopのスケジュールタスク、cronはCLIで完結させたい人向け
ローカルのファイルを扱う定期実行なら、まずはClaude Code Desktopのスケジュールタスクが始めやすいと感じています。画面から設定でき、権限の承認やスキップされた実行の履歴も確認できるからです。
cron(macOSやLinuxで決まった時刻にコマンドを動かす仕組み)は、「Desktopアプリを開いておきたくない」「シェルスクリプトで完結させたい」人向けです。そのぶん、自分で面倒を見る部分が増えます。
Claude Codeを定期実行する4つの方法
公式ドキュメントで紹介されている3つの仕組みに、OSのcronを加えて整理しました。
| 方法 | 動く場所 | PCの起動 | 主な特徴 |
|---|---|---|---|
| クラウドのスケジュールタスク | Anthropicのクラウド | 不要 | PCがオフでも動く。ローカルファイルは触れない |
| Desktopのスケジュールタスク | 自分のPC | 必要 | ローカルファイルを扱える。アプリが開いている必要あり |
| `/loop` | 自分のPC | 必要 | 開いているセッションの中だけで繰り返す |
| cron + `claude -p` | 自分のPC | 必要 | OSの仕組みで起動。設定・監視は自分で行う |
Desktopのスケジュールタスクは、スリープ中に逃した回を、アプリの次回起動時やPCのスリープ復帰時に直近1回分だけ実行します(過去7日以内)。一方cronは、スリープ中の回をそのまま飛ばします。macOSでこれを避けたい場合、Appleは`launchd`を推奨しています(`StartCalendarInterval`を使うとスリープ明けにまとめて1回実行。ただし電源オフ中の回は補完されません)。
Desktop版の設定はスケジュールタスクで寝ている間に作業を終わらせる話、`/loop`は/loopで勝手に繰り返してくれる話で紹介しています。ここではcronに絞ります。
cronでClaude Codeを定期実行する手順
cronから呼ぶのは、`claude -p`という非対話モードです。プロンプトを渡すと、画面を開かずに処理して終了します。
今回確かめた範囲:ラッパーの起動、二重起動のスキップ、終了コードの記録、認証エラーの検出まで。未検証:要約が実際に作られるところと、cronからの実起動です。
1. 試験用フォルダとラッパーを用意する
既存のファイルを上書きしないよう、専用フォルダ(例:`~/jobs/daily-summary/`)を作り、試験用の`note.txt`を置きます。そこに次の`run_job.sh`を保存します。
#!/bin/sh
CLAUDE=/path/to/claude # `which claude` の結果に置き換える
JOBDIR="$(cd "$(dirname "$0")" && pwd)"
LOCK="$JOBDIR/job.lock"
LOG="$JOBDIR/job.log"
# 前回の実行が終わっていなければスキップ(二重起動防止)
if ! mkdir "$LOCK" 2>/dev/null; then
if [ -d "$LOCK" ]; then
echo "$(date '+%F %T') skip: ロックあり" >> "$LOG"; exit 0
fi
echo "ロックを作れません(権限など)" >&2; exit 1
fi
trap 'rmdir "$LOCK"' EXIT
cd "$JOBDIR" || exit 1
"$CLAUDE" -p "note.txt を読んで1行で要約し、summary.txt に書いて" \
--tools "Read,Write" --allowedTools "Read,Write" \
--permission-prompts none --output-format json \
< /dev/null > last_result.json 2> last_error.txt
code=$? # claudeの終了コードをすぐ保存する
echo "$(date '+%F %T') exit=$code" >> "$LOG"
exit "$code"
- `–tools`で使える道具そのものを絞り、`–allowedTools`でそれを承認なしで使えるようにする
- `–permission-prompts none`で、承認待ちで止まらず「拒否して続行」にする(CLI 2.1.259以降)
- `summary.txt`・`last_result.json`・`last_error.txt`は毎回上書きされる
`–dangerously-skip-permissions`で全部許可する例も見かけますが、誰も見ていない時間に動くからこそ、許可は絞るほうが安心です。
2. 実行権限を付けて手で動かす
chmod +x ~/jobs/daily-summary/run_job.sh
~/jobs/daily-summary/run_job.sh; echo $?
`job.log`の終了コードに加え、`last_result.json`の`is_error`(失敗ならtrue)・`result`・`permission_denials`と、`summary.txt`の中身まで確認します。終了コード0・`is_error: false`・要約ができていることを確かめてから、次の登録に進みます。
3. crontabに登録する
編集前に`crontab -l > crontab_backup.txt`でバックアップを取り、`crontab -e`で1行追加します(毎朝9時の例)。`crontab -r`は登録を丸ごと消すので注意してください。
0 9 * * * /Users/yourname/jobs/daily-summary/run_job.sh
強制終了などで`job.lock`が残ると、以後ずっとスキップされます。`ps aux | grep claude`で実行中でないことを確かめてから、`rmdir`で消してください。
試してわかった3つの落とし穴
環境変数を最小限にした状態(cronに近い環境)で、ラッパーを手動実行しました。
落とし穴1:`claude`コマンドが見つからない
cronはPATHがかなり少ない状態で動くため、`claude: command not found`(終了コード127)になりました。私の環境ではフルパス指定で解消しました。Node.js経由で動く環境では、`node`へのPATHも必要な場合があります。
落とし穴2:標準入力を待って警告が出る
`< /dev/null`がないと「3秒間入力が来なかった」という警告が出て、結果ファイルに混ざりJSONとして読めなくなりました。入力なしを明示し、stderrを別ファイルに分けると解消しました。
落とし穴3:ログインが切れていると何もせず終わる
正直に書くと、本体の処理まで届きませんでした。`Not logged in`という認証エラーで終了コード1になったのです。エラーは`last_result.json`側に記録され、stderrは空でした。
定期実行では誰も見ていないので、ログを見る習慣か、失敗時の通知が必要です。復旧は、ふだんのターミナルで`claude auth status`を確認し、必要なら`claude auth login`でログインし直してから、ラッパーを手動で再実行します。
毎日動かしている定期タスクで効いた工夫
このブログの記事制作も、2026年4月からDesktopのスケジュールタスクで動かしています。続けるうちに、ロックファイル(二重起動防止)、事前チェック(必要なファイルがなければ即終了)、進捗ログ(止まっても続きから再開)をプロンプトに足しました。
「失敗しないこと」より「失敗に気づけて、やり直せること」が大事だと感じています。
Claude Codeに貼れるプロンプト
毎朝9時に、このフォルダの作業を定期実行したいです。
作業内容: [例: inbox フォルダのメモを要約して summary.md に追記する]
次の順番で進めてください。
1. Desktopのスケジュールタスク・cron・クラウドのどれが向いているか、理由つきで提案する
2. cronの場合は、二重起動防止と終了コードのログを含むラッパー案を作る(まだ保存しない)
3. 再実行しても同じメモを重複して追記しない方法と、追記・上書きの方針を提案する
4. --tools と --allowedTools に入れる道具を、必要最小限で提案する
ファイルの作成・上書き・削除や crontab への登録の前に、対象ファイル一覧、内容、影響範囲を表示し、私が明示的に承認するまで実行しないでください。
不明点は推測せず、確認事項として列挙してください。
まだわからないこと
認証切れを無人でどう防ぐのが一番手間が少ないかは、まだ答えが出ていません。APIキーを使う方法もありますが、従量課金になり、キーの管理も必要です。
まとめ
- ローカルのファイルを扱うなら、まずDesktopのスケジュールタスクが始めやすい
- cronでは`claude -p`を使い、ラッパーを手で試してから登録する
- PATHが少ないので`claude`はフルパスで書く
- `< /dev/null`とstderrの分離で、結果のJSONを壊さない
- 終了コードと`is_error`を記録し、「失敗に気づける」状態にしておく
定期実行は、設定した瞬間より1週間後にちゃんと動いているかのほうが大事です。まずは小さな作業から試してみてください。
権限まわりが不安な方は、Claude Codeの設定を最適化した話もあわせてどうぞ。
なお、Claude Codeに作業を任せる前提になるGitの操作を、手を動かして学べる学習アプリも準備中です。app.maahsachi.com(公開準備中)で試せるようになる予定です。
参考(2026年10月28日時点で確認)
- [Claude Code Desktop でスケジュール設定されたタスクを実行する(Claude Code Docs)](https://code.claude.com/docs/ja/desktop-scheduled-tasks)
- [Run Claude Code programmatically(Claude Code Docs)](https://code.claude.com/docs/en/headless)
- [CLI reference(Claude Code Docs)](https://code.claude.com/docs/en/cli-reference)
- [Scheduling Timed Jobs(Apple Developer)](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html)