Claude Codeへのあいさつをcronで自動化
こんにちは!トレジャー・ファクトリーでシステムエンジニアをしている鈴木です。
最近はサブエージェントでClaude Codeにレビューをさせてみたり、新機能を実装する際のUIのプロトタイプを作ってみたりと色々試行錯誤してClaude Codeを楽しんでいます。
この記事で伝えたいこと
- cronでClaude CodeのCLIコマンドを実行するための方法
- 動かすためにハマったポイント
この記事で記載しないこと
- cronの説明
- ネイティブWindows上のClaude Codeでの設定方法について
- やっていることは単純なので応用は出来ると思います
背景
個人で契約しているプランがProプランということもあり、色々試行錯誤していると業務時間中にコンテキストの上限に達してしまうことも多く困っていました。
そんな時に以下の記事を拝見いたしました。
Claude Codeは最初にメッセージを送信してから5時間の制限が開始されるので業務時間から実行するとコンテキスト2回分しか利用できない。
そこで朝7時に最初にメッセージを送信することによって業務時間で利用出来るコンテキストの量を3回分確保するということでProプランを利用している者として非常に参考になりました。
しかし、以下の点でなんとか自動化出来ないかなと思いました。
- 毎回決まった時間にメッセージを送るのが大変
- 朝7時に起きたくない!
そこで一番手っ取り早い手段としてcronで定期的にClaude Codeにメッセージを送信してコンテキストの開始を自動化しようと思いました。
検証した環境
WSL環境にClaude Codeをインストールして利用しています。
- WSL(Ubuntu 22.04.5 LTS)
- node v22.15.0
- nvmで管理
設定手順
とりあえず動かしたい方はこちらの内容をご確認ください。
1. シェルスクリプトファイルの設定
適当なところにcronで実行するシェルスクリプトを作成してください。
私の場合はホームディレクトリを作成しました。
/home/<username>/claude_cron.sh
<username> の部分はご自身のユーザー名に置き換えてください。
#!/bin/bash
# Node.js管理ツールの場所を確認
export NVM_DIR="$HOME/.nvm"
# Claude Codeが動作するように環境変数を設定
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# LTSバージョンを利用
nvm use --lts
# 実行したい内容
claude -p "おはよう!今日も一日頑張りましょう"
ポイント
環境変数の読み込み
ここが今回ハマったポイントでした。
-
export NVM_DIR="$HOME/.nvm"
- Node.js管理ツールの場所を確認
-
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
- nvm.shの存在を確認して、中身があれば読み込み
-
nvm use --lts
- LTSバージョンを利用
私の環境ではNode.jsをnvmを利用してインストールしていました。
cronの実行環境では最低限の環境変数しか読み込まれない為、NVMの環境変数を読み込むことが必要でした。
この部分についてはNode.jsのインストール方法によって変わると思います。
pオプション
claude -p
インタラクティブモードで実行し、レスポンスを出力させます。
今回はpオプションしか利用しませんがその他のオプションは以下から参照してください。
2. 実行権限の付与
cronで実行出来るように実行権限を付与
$ chmod 755 /home/<username>/claude_cron.sh
付与したら実行してみてレスポンスが返ってきて出力されるかを確認してください。
cronと同様に最低限の環境変数しか読み込まずに実行。
$ env -i SHELL=/bin/sh HOME="$HOME" USER="$USER" LOGNAME="$USER" PATH=/usr/bin:/bin /home/<username>/claude_cron.sh
Now using node v22.15.0 (npm v11.4.2)
おはよう!今日も頑張りましょう!
何かお手伝いできることはありますか?
3. crontabでジョブを設定
# タイムゾーンを日本時間(JST)に指定
CRON_TZ=Asia/Tokyo
0 7,12,17 * * 1-5 /home/<username>/claude_cron.sh
タイムゾーンの設定については必要な方は設定してください。
2025年8月28日から週ごとの利用制限が適用されるということで無駄に実行されないように実行タイミングは平日のみに絞っています。
- 0 7,12,17
- 07:00、12:00、17:00
- 1-5
- 月曜日~金曜日
4. 確認方法
指定した時間でセッションがスタートしているかはccusage
にて確認しました。
インストールしていない方は下記からご確認をお願いいたします。
ccusage blocks
を実行してセッションの開始が行われていることが確認出来たらOK
$ ccusage blocks
├───────────────────────────────────────────────────┼─────────────────┼─────────────────────────┼─────────────┼───────────┤
│ 2025/8/8 7:00:00 (0m) │ │ - sonnet-4 │ 14,039 │ $0.05 │
├───────────────────────────────────────────────────┼─────────────────┼─────────────────────────┼─────────────┼───────────┤
│ 2025/8/8 12:00:00 (0m) │ │ - sonnet-4 │ 14,050 │ $0.05 │
ハマりポイント解消までの流れ
ここまで行き着くまでの内容も記載しておきます。
もともとは以下のようにcrontabに設定していました。
0 7,12,17 * * 1-5 /home/<username>/.nvm/versions/node/v22.15.0/bin/claude -p "おはよう!今日も一日頑張りましょう"
しかし、この設定だと上手くいかないのでログに出力してみました。
~ コードが長々と出力されるので割愛 ~
SyntaxError: Unexpected token '.'
at Loader.moduleStrategy (internal/modules/esm/translators.js:133:18)
at async link (internal/modules/esm/module_job.js:42:21)
どうやらESモジュールエラーが発生している。
参照されているNode.jsが古いバージョンの可能性がありそう🤔
そこで、cronの環境で実行されるnodeの情報を確認するためにClaude Codeに確認用のスクリプトを作成してもらいました。
#!/bin/bash
# Node.js バージョンチェックスクリプト
echo "=== Node.js Version Check $(date) ==="
# 現在の環境情報
echo "Current PATH: $PATH"
echo "Current User: $USER"
echo "Current Shell: $SHELL"
echo ""
# 環境設定前のNode.js状況
echo "--- Before NVM Setup ---"
echo "Node location: $(which node 2>/dev/null || echo 'Node not found')"
echo "Node version: $(node --version 2>/dev/null || echo 'Node not available')"
echo "NPM location: $(which npm 2>/dev/null || echo 'NPM not found')"
echo "NPM version: $(npm --version 2>/dev/null || echo 'NPM not available')"
echo ""
# NVM環境設定
echo "--- Setting up NVM ---"
source ~/.bashrc 2>/dev/null
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" 2>/dev/null
# 環境設定後のNode.js状況
echo "--- After NVM Setup ---"
echo "Updated PATH: $PATH"
echo "NVM_DIR: $NVM_DIR"
echo "NVM_BIN: $NVM_BIN"
echo ""
echo "Node location: $(which node 2>/dev/null || echo 'Node not found')"
echo "Node version: $(node --version 2>/dev/null || echo 'Node not available')"
echo "NPM location: $(which npm 2>/dev/null || echo 'NPM not found')"
echo "NPM version: $(npm --version 2>/dev/null || echo 'NPM not available')"
echo ""
# Claude Code確認
echo "--- Claude Code Check ---"
echo "Claude location: $(which claude 2>/dev/null || echo 'Claude not found')"
echo "Claude version: $(claude --version 2>/dev/null || echo 'Claude not available')"
echo ""
echo "=== Check Complete ===
cronで読み込まれる環境変数を再現して実行
env -i SHELL=/bin/sh HOME="$HOME" USER="$USER" LOGNAME="$USER" PATH=/usr/bin:/bin /home/<username>/node_version_check.sh
以下のようにv12.22.9が参照されてしまっている。
=== Node.js Version Check Mon Aug 11 23:33:10 JST 2025 ===
Current PATH: /usr/bin:/bin
Current User: <username>
Current Shell: /bin/sh
--- Before NVM Setup ---
Node location: /usr/bin/node
Node version: v12.22.9
NPM location: /usr/bin/npm
NPM version: 8.5.1
--- Setting up NVM ---
--- After NVM Setup ---
Updated PATH: /home/<username><username>/.nvm/versions/node/v22.15.0/bin:/usr/bin:/bin
NVM_DIR: /home/<username>/.nvm
NVM_BIN: /home/<username>/.nvm/versions/node/v22.15.0/bin
Node location: /home/<username>/.nvm/versions/node/v22.15.0/bin/node
Node version: v22.15.0
NPM location: /home/<username>/.nvm/versions/node/v22.15.0/bin/npm
NPM version: 11.4.2
--- Claude Code Check ---
Claude location: /home/<username>/.nvm/versions/node/v22.15.0/bin/claude
Claude version: 1.0.72 (Claude Code)
=== Check Complete ===
Ubuntu 22.04.5ではapt install nodejs
でインストールするとv12がインストールされるのでそちらを参照するようになってしまっていた。(いつインストールしたっけ、、、)
nvmでインストールしたv22.15.0を参照出来るようにしたいのでnvmの仕組みを確認
nvmでは~/.bashrc
にて以下の記述によってインストールしたNode.jsを参照出来るようにしている。
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
nvm use --lts
よって、こちらの記述をシェルスクリプトにも記述することで動かせるようになりました!
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
はタブ補完に関する記述なのでスルーしています。
.bashrc
をシェルスクリプトで読み込んでも良かったんですが、色々他の設定も含まれているので必要最低限の内容を読み込んで対応しました。
これで無事解決といった流れでした👏
まとめ
最初は簡単に出来るかなと思っていたんですがnvmの仕組みをあまり理解していなかったので思いの外ハマりました。
とりあえず、無事自動化することが出来て良かったです。
他にもいくつか自動で動かしたいジョブがあったので今回の内容を元に設定してみたいと思います。
もしNode.jsをnvmでインストールしており、cronでclaudeコマンドを実行出来ずに困っている方の参考になればと思います。
Discussion