---
title: "寝ている間もAIを動かす｜cron＋Claude Code CLIによる夜間自動実行の構築と権限の壁"
excerpt: "利用プランのレートリミットを日中だけでは使い切れないという課題から、cron（02:10）でClaude Code CLIを起動し記事を自動生成する仕組みを構築しました。生成自体は正常動作した一方、外付けSSDへのWrite権限がサブエージェントに引き継がれず保存に失敗。無人実行でつまずく3つのポイントを記録しています。"
author: "AI活編集部"
author_username: ai-katsu-editorial
published_at: 2026-04-15T00:00:00+00:00
verified_at: 2026-04-15T00:00:00+00:00
models: ["Claude Code"]
tools: ["Astro"]
tasks: ["業務自動化・ワークフロー", "業務プロジェクト"]
domain: "社内基盤・インフラ"
canonical_url: https://ai-katsu.jp/articles/nightly-scheduled-tasks
---
# 寝ている間もAIを動かす｜cron＋Claude Code CLIによる夜間自動実行の構築と権限の壁

AIツールのサブスクリプションには、時間あたり・週あたりの利用上限があります。日中の作業だけでは使い切れず、**就寝中は活用率0%**です。

この検証は「寝てる間も動く仕組みを作りたい」という発想から始まりました。**cronで深夜2時10分にClaude Code CLIを起動し、記事を自動生成する仕組み**を構築しています。

## この検証の概要

| 項目 | 内容 |
| --- | --- |
| 検証時期 | 2026年4月15日〜（検証中） |
| 使用ツール | Claude Code CLI（`claude --permission-mode auto -p`）／macOS cron + `pmset`／Astro 6.1.4 + MDX |
| 目的 | 非稼働時間帯（主に深夜〜早朝）にAIを自律的に動かし、週あたりのレートリミット消化率を最大化する |
| 構築したもの | cron（02:10）→ `generate-ai-articles.sh` → `claude --permission-mode auto -p` → MDX保存 |
| 成果 | **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活用の検証を日々行い、企業の業務自動化を支援しています。ご相談は[お問い合わせフォーム](/contact)から、継続的な伴走支援については[AI参謀](/ai-sanbo)をご覧ください。
