メインコンテンツへスキップ
Guide · Automation

Claude Codeを常駐させ業務を毎日自動実行する|PM2 / launchd / cron 実運用

Claude Code は対話だけの道具ではない。CLI を定期実行に組み込めば、日次の調査やレポートを人が見ていない時間に回せる。当社が Mac mini で約 28 本の cron ジョブをどう常駐させているか、踏んだ事故込みで公開します。

Radineer 編集部 ・ 自社の Claude Code 本番運用に基づく解説(2026 年 5 月時点)

Claude Code の自動化とは、対話を介さず CLI を定期実行・常駐させ、日次の調査やレポートといった業務を無人で回す運用を指す。鍵になるのは、プロセスを止めずに動かし続けるプロセス管理(常駐)と、決まった時刻に起動するスケジューリング(cron)の設計である。

CLI を定期実行する設計

自動化の出発点は「Claude Code を対話ではなく CLI として呼ぶ」ことにある。決まったプロンプトやスキルを CLI で実行し、その出力をファイルやレポートに落とす。これを定時に起動すれば、日次ジョブになる。

当社は Mac mini 上でこの仕組みを常駐させ、約 28 本の cron で日次ジョブを回している。求人クロール、各種レポート、SNS の下書き生成などが、人の操作なしに毎日動く。

設計で考えるべきは大きく 2 つ。「決まった時刻に起動する仕組み(スケジューリング)」と「起動したプロセスを面倒見る仕組み(プロセス管理)」だ。ここを誰に任せるかで、安定度が大きく変わる。

launchd の落とし穴

macOS には標準で launchd という常駐・スケジューリングの仕組みがある。最初の選択肢になりがちだが、当社の運用では落とし穴が多かった。

最大の罠は、launchd が ~/Desktop 配下のスクリプトを実行できないこと。macOS の TCC(プライバシー保護)の制約で、Desktop など保護されたフォルダ配下のプロセスは弾かれる。これに当たると EINTR や uv_cwd といったエラーが出て、原因が分かりにくい。

さらに launchd は無音で停止することがある。エラーも出さずジョブが動かなくなり、気づいたら数日止まっていた、という事故が起きやすい。「止まったことに気づけない」のが一番こわい。

PM2 を原則にする理由

こうした経緯から、当社は Mac mini での常駐を PM2 で行うことを原則にしている。PM2 はプロセスを監視し、落ちたら再起動し、ログを残してくれるプロセスマネージャだ。

launchd の「無音停止」「Desktop 配下を実行できない」という二大問題を、PM2 は避けられる。常駐の本体は PM2 に任せ、決まった時刻の起動は cron もしくは PM2 側のスケジュール機能で担う、という分担に落ち着いた。

ポイントは、launchd を全否定しているのではなく、「Desktop 配下を含む業務常駐の本命は PM2」という当社の実運用上の結論だということ。

実例:日次クロール & レポート

具体例として、当社の求人クロールは 5 つのプラットフォームを毎朝クロールし、結果をまとめる日次ジョブとして動いている。競艇予想や M&A 案件の監視など、同種の「毎日決まった時刻に取りに行く」ジョブが約 28 本走っている。

いずれも構造は同じだ。cron が定時に起動 → CLI で Claude Code を実行 → 出力をレポート化 → 必要なら通知。これを PM2 配下で常駐させ、落ちても自動で立ち上がるようにしている。

  1. 定時に起動する(cron もしくは PM2 のスケジュール)
  2. CLI で Claude Code を実行し、調査・整形をさせる
  3. 出力をレポートやファイルに落とす
  4. 必要なら通知し、ログを残す

環境変数欠落事故の防ぎ方

常駐自動化で最も痛かった事故が、環境変数の欠落だ。

プロセスを .env を読み込まないラッパーで起動してしまうと、起動時に設定が欠けてプロセスが即落ちする。PM2 は「落ちたら再起動」してくれるので、設定が欠けたまま無限に再起動を繰り返す。当社はこれで 52,039 回の再起動事故を起こした。

対策はシンプルで、PM2 のエントリは必ず .env を読み込むラッパー経由で起動する。env が無ければそもそも起動しない、あるいは起動前に検証して落とす。「再起動で粘る」より「設定が無ければ起動させない」方が安全だ。

なお cloudflared のような常駐プロセスを再読込するときは、SIGKILL で強制終了してはいけない。launchctl kickstart のような正規の再起動手段を使う。乱暴に殺すと別の不調を呼ぶ。

PM2 / launchd / cron の使い分け

3 つは役割が違う。常駐の面倒を見るのが PM2、決まった時刻に起動するのが cron、macOS 標準の両刀が launchd。当社の結論は「常駐は PM2、定時起動は cron」。

仕組み役割当社の評価
PM2常駐プロセスの監視・再起動・ログ業務常駐の本命。原則これを使う
cron決まった時刻にコマンドを起動定時起動に。約 28 本のジョブを駆動
launchdmacOS 標準の常駐+スケジューリングDesktop 配下不可・無音停止のため非推奨

よくある落とし穴

  • launchd で ~/Desktop 配下を実行する:TCC で弾かれ、EINTR や uv_cwd エラーになる。配置場所を変えるか PM2 に寄せる。
  • launchd の無音停止を放置する:エラーも出ず止まる。気づける監視を別に持つか、PM2 にする。
  • .env を読まないラッパーで起動する:設定欠落で無限再起動。当社は 52,039 回の再起動事故を経験した。env 読込ラッパーを必須にする。
  • 常駐プロセスを SIGKILL で再読込する:cloudflared 等は launchctl kickstart など正規の手段を使う。
FAQ

よくある質問

macOS で Claude Code を常駐させるなら launchd と PM2 どっち?

当社は PM2 を原則にしている。launchd は ~/Desktop 配下を実行できず(TCC 制約)、無音で停止することがあるため。常駐は PM2 に任せ、定時起動は cron で担うのが安定する。

launchd で EINTR や uv_cwd エラーが出るのはなぜ?

~/Desktop など保護フォルダ配下のスクリプトを launchd が TCC 制約で実行できないことが原因のことが多い。配置場所を保護外に移すか、PM2 での常駐に切り替える。

常駐プロセスが大量に再起動を繰り返すのはなぜ?

多くは環境変数の欠落。.env を読まないラッパーで起動するとプロセスが即落ちし、PM2 が再起動を繰り返す。当社は 52,039 回の再起動事故を経験した。env を読み込むラッパーを必須にする。

cron は使わなくていい?

常駐の面倒を見る PM2 と、定時起動する cron は役割が違う。当社は約 28 本の cron で日次ジョブを起動し、その実行プロセス自体は PM2 配下で常駐させている。両方を役割分担で使う。

Claude Code を業務に入れたいが コスト事故 が怖い。

当社が踏んだ失敗を前提にした導入設計を、30 分の無料相談で扱います。NDA 締結可。

30 分の無料相談を予約 →他の実践ガイドを見る