AIツールのサブスクリプションには、時間あたり・週あたりの利用上限があります。日中の作業だけでは使い切れず、就寝中は活用率0%です。
この検証は「寝てる間も動く仕組みを作りたい」という発想から始まりました。cronで深夜2時10分にClaude Code CLIを起動し、記事を自動生成する仕組みを構築しています。
この検証の概要
検証時期 | 2026年4月15日〜(検証中) |
|---|---|
使用ツール | Claude Code CLI( |
目的 | 非稼働時間帯(主に深夜〜早朝)にAIを自律的に動かし、週あたりのレートリミット消化率を最大化する |
構築したもの | cron(02:10)→ |
成果 | 5記事分のドラフト内容の生成を確認(品質は既存記事と遜色なし)/保存成功は0件(権限問題により保留中) |
状況 | 進行中 |
結論:生成は動いた。詰まったのは権限だった
この検証の現状を正確に書くと、こうなります。
記事の内容生成自体は問題なく動作し、品質も既存記事と遜色ないレベルでした。しかし保存成功は0件です。原因は生成ではなく、ファイル書き込みの権限にあります。
具体的には、外付けSSDへのWrite権限がサブエージェントに引き継がれないという問題です。
--permission-mode autoでも、作業ディレクトリ外への書き込みは別途許可が必要settings.local.jsonのallowにWrite(/Volumes/...)を追加したが、サブエージェント(Agent toolで並列生成)には権限が完全には引き継がれなかった- グローバル設定に追加しても解消せず
根本的な対処として、対象プロジェクトをMac内蔵ストレージへ移行する方針に切り替えました。
無人実行では、権限の設計がそのまま成否を分けます。対話的に実行していれば都度許可すれば済む場面が、無人だとそこで止まります。
なぜcronを選んだのか
スケジュール実行の手段はいくつかありますが、既存のcronインフラに乗せる方針を採用しました。
理由は「Macが深夜に確実に起動している前提が成立しており、cronが最もシンプル」だからです。
同様に、専用のTypeScriptスクリプト(SDK利用)ではなくClaude Code CLIに prompt.md を渡す方式を選んでいます。理由は追加の依存関係がなく、WebSearchやAgent toolがCLI側で既に使えるためです。
すでに動いている仕組みの上に載せるほうが、新しく作るより確実です。夜間実行は障害に気づきにくいため、部品を減らす判断が効きます。
バッチ実行の基本形
claude --permission-mode auto -p "$(cat prompt.md)"この形がバッチ実行の基本形として機能します。-p モードでプロンプトファイルを渡すだけで、WebSearchやAgentの並列実行が動きます。
トピック選定は prompt.md と topic-queue.json によるハイブリッド方式で設計しました。
ハマりポイント3つ
① timeout コマンドがmacOSに存在しない
スクリプト内で timeout 1740 claude ... としていましたが、macOSはデフォルトでGNU coreutilsを持たないため timeout: command not found で即終了しました。
対処は timeout を除去してclaudeコマンドを直接実行することです。代替として perl -e 'alarm(1740); exec @ARGV' -- command を使うか、Homebrewで coreutils を入れて gtimeout を使う選択肢があります。
② グローバル設定の defaultMode: "plan" がバッチ実行を妨害
~/.claude/settings.json に "defaultMode": "plan" が設定されていたため、--permission-mode auto で起動してもプランモードに入り「承認いただければ実行を開始します」で停止しました。
対処は、プロジェクト設定(.claude/settings.local.json)に "permissions": { "defaultMode": "auto" } を追加してオーバーライドすることです。
無人実行では、確認を求めて止まる設定が致命的になります。対話用の設定がそのまま効いていないか、確認が必要です。
③ crontab書き込みがプロジェクト設定でブロックされた
.claude/settings.local.json に "allow": ["Bash(crontab -l)"] のみ設定されており、crontab /tmp/xxx の書き込みがブロックされました。"Bash(crontab /tmp/crontab_new.txt)" をallowに追加して解決しています。
安全側の設計:denyリストは auto でも有効
無人で動かす以上、暴走への備えが必要です。
破壊的コマンド(rm / git push / sudo など)をdenyリストで永続ブロックしました。重要なのは、deny リストは --permission-mode auto でも有効だという点です。
「基本は自動で通す。ただし危険なものは常に止める」という設計が、無人実行では現実的です。すべてを許可するのでも、すべてを確認するのでもない中間が必要になります。
技術的な発見
claude --permission-mode auto -p "$(cat prompt.md)"がバッチ実行の基本形settings.local.jsonのpermissions.defaultMode: "auto"でグローバルのplanをプロジェクト単位でオーバーライドできるdenyリストは--permission-mode autoでも有効- 外付けドライブへの書き込みは
additionalDirectoriesだけでは不十分。allowへのWrite(path/**)の明示追加が必要だが、サブエージェントへの権限引き継ぎは不安定
残っている課題
- 対象プロジェクトのローカル移行が完了していないため、記事の自動保存が未実現
- 移行後にスクリプト3箇所のパス更新が必要(
generate-ai-articles.sh/prompt.md/settings.local.json)
よくある質問
なぜ夜間に自動実行するのですか?
利用プランのレートリミットを、日中の作業だけでは使い切れていないためです。就寝中は活用率0%になるため、非稼働時間帯に自律的に動かして消化率を上げるという発想です。
なぜcronを使うのですか?
Macが深夜に確実に起動している前提が成立しており、最もシンプルだからです。すでに動いている仕組みに載せるほうが、新しく作るより確実に動きます。
無人実行で気をつけることは?
権限設定と、確認を求めて止まる設定です。グローバル設定の defaultMode: "plan" が効いていると承認待ちで停止します。また、作業ディレクトリ外への書き込みは別途許可が必要で、サブエージェントへの権限引き継ぎは不安定です。
暴走が心配ではないですか?
破壊的コマンド(rm / git push / sudo など)をdenyリストで永続ブロックしています。denyリストは --permission-mode auto でも有効です。
まとめ
- cron(02:10)→ シェルスクリプト →
claude --permission-mode auto -p→ MDX保存という夜間実行の仕組みを構築 - 記事の内容生成は正常動作し品質も既存記事と遜色なし。ただし保存成功は0件(権限問題により保留)
- 詰まったのは外付けSSDへのWrite権限がサブエージェントに引き継がれない問題。ローカル移行で対処する方針
- macOSに
timeoutは存在しない。gtimeoutかperl -e 'alarm(...)'で代替 - グローバルの
defaultMode: "plan"がバッチ実行を止める。プロジェクト設定でオーバーライドする - denyリストは auto モードでも有効。「基本は自動、危険なものは常に止める」が無人実行の現実解
自動実行の仕組みは、動かす部分より止まる部分の設計に手間がかかります。無人で回すなら、権限と確認の挙動を先に洗い出しておくと詰まりにくくなります。
株式会社AI棒では、こうしたAI活用の検証を日々行い、企業の業務自動化を支援しています。ご相談はお問い合わせフォームから、継続的な伴走支援についてはAI参謀をご覧ください。
