claude -pが朝いきなり止まる前に!Claude Code 2.1.318のログイン期限チェックとsetup-tokenの使い分け
🙌 結論から
無人で回している claude -p は、ログインの期限を先に見ておけば朝いきなり止まらずに済みます。
11月4日に出たClaude Code 2.1.318で、claude auth status にログインが切れる日(loginExpiresAt)が出るようになりました!
claude -p のJSONの結果にも credential_expires_at が入り、切れる10日前からはテキスト出力に1行の警告も出ます👀
このサイトも毎朝の定期実行で記事の草稿やSNSの候補を準備しているので、「ある朝なにも動いてなかった」は正直いちばん避けたいパターンです🤔
ログインで動かすか、claude setup-token の長期トークンで動かすかも、ここで決めておくとかなり楽・・!
💡 2.1.318でログインの期限が見えるようになった
公式の変更履歴(CHANGELOG)で、2.1.318の認証まわりの変更はこの4つです。
claude auth statusに、保存されたclaude.aiのログインが切れる日(loginExpiresAt)が出るclaude -pのJSONの結果にcredential_expires_atが入る- 切れる10日前から、
claude -pのテキスト出力に1行の警告がstderrで出る - ログインが期限切れになったときのエラーが、それをはっきり伝えるようになった(
claude -pではclaude auth loginとclaude setup-tokenを案内)
npmの公開記録では、2.1.318は日本時間の11月4日の朝に出ています👍
これまでも対話モードなら、期限の3日前から起動時に Your login expires in 3 days · run /login to renew という警告は出ていました!
ただこれは起動したときの画面に出るものなので、人が見ていない claude -p だと気づけないんですよね・・・(´・ω・`)
10日前から無人の実行の出力にも出るようになったのが、今回いちばん大きいところです。
🤔 無人の実行はなぜ止まるのか
公式の認証ドキュメントでは、/login で保存したログインが切れて更新もできなくなると、モデルへのリクエストは毎回 Login expired · Please run /login で失敗する、と書かれています。
しかも警告自体はリクエストを止めないので、期限の当日までは普通に動いてしまうんです。
前の日まで元気に動いていたのに、次の朝だけ全部コケる、という止まり方になります(´;ω;`)
同じページには、エージェントビューのバックグラウンドのセッションやRemote Controlのセッションは、ログインが切れると自分では立ち直れないとも書かれていました👀
なので無人で回すなら、止まってから気づくより、10日前の時点で気づける形にしておくのが大事です。
🔧 私ならこの3行で見張ります
claude auth status は、ログインしていれば終了コード0、していなければ1を返します(CLIリファレンスより)。
出力はJSONなので、jq で期限だけ抜き出せます🙌
定期実行のスクリプトの先頭に置くなら、私はこの形にします。
# 1. ログインしていなければ、ここで止めて通知に回す
claude auth status > /tmp/claude-auth.json || { echo "Claude Codeにログインしていません"; exit 1; }
# 2. ログインが切れる日をログに残す(2.1.318以降)
jq -r '.authMethod, .loginExpiresAt' /tmp/claude-auth.json >> ~/logs/claude-auth.log
# 3. 本番の実行。stderrの警告を捨てずにログへ
claude -p "今日のタスクを処理して" --output-format json 2>> ~/logs/claude-stderr.log | jq -r '.credential_expires_at'
ポイントはstderrを /dev/null に捨てないことです!
10日前の警告はstderrに出るので、2>/dev/null のままだと今回の改善がまるごと見えなくなります😭
authMethod は claude.ai・oauth_token・api_key などのどれかが入るので、「今どの認証で動いているか」も一緒に残しておくと、あとで迷いません(^_^)
ちなみに対話モードなら /status の Login の行で、期限切れのときは Expired — log in again と出ます。
👀 /loginとsetup-tokenの使い分け
そもそも無人で回すなら、ログインではなく claude setup-token で作る長期トークンという手もあります💡
公式ドキュメントの説明を表にするとこうです。
| 方法 | 有効期限 | 使い方 | 向いている場面 |
|---|---|---|---|
/login(claude auth login) | 期限あり・自動で更新 | ブラウザでログイン | 普段の対話・自分のMacでの定期実行 |
claude setup-token | 1年 | 表示されたトークンを CLAUDE_CODE_OAUTH_TOKEN に入れる | CIやスクリプトなど、ブラウザが開けない場所 |
ANTHROPIC_API_KEY | キーによる | 環境変数に入れる | 従量課金のAPIで回したいとき |
setup-tokenはPro・Max・Ultra・Team・Enterpriseのどれかのプランが必要で、モデルへのリクエストしかできないトークンです。
なのでRemote Controlのセッションを作ったり、claude.aiのコネクタを取ってきたりはできません(手元で設定したMCPサーバーは使えます)🙌
私の使い分けは、自分のMacで動かすものは /login のまま期限を見張る、ブラウザを開けないCIだけsetup-token、の2つにしています✨
1年のトークンは楽なんですが、表示されたトークンはどこにも保存されないので、置き場所(パスワード管理アプリやCIのSecrets)を先に決めてから発行するのがおすすめです。
🔥 ハマりやすいところ
最後に、ドキュメントを読んでいて「これは引っかかりそう」と思ったところを3つ書いておきます。
ANTHROPIC_API_KEYが残っていると、claude -pは必ずそれを使います。 対話モードなら最初に確認されますが、-pでは聞かれません。サブスクで回しているつもりが従量課金になっていた、を防ぐにはauthMethodを見るのが早いです--bareで起動するとCLAUDE_CODE_OAUTH_TOKENは読まれません。 起動を速くしたくて--bareを付けるなら、ANTHROPIC_API_KEYかapiKeyHelperで認証する必要がありますCLAUDE_CODE_OAUTH_TOKENを入れたまま/loginすると、そのセッションは新しいログインに切り替わります。 次からもログインで動かしたいなら、シェルの設定ファイルから環境変数を消しておきます!
1つ目は特に、気づかないまま請求が来るタイプなのでこわいです(T_T)
主な優先順位は「環境変数のAPIキー → apiKeyHelper → setup-tokenのトークン → /login のログイン」の順なので、上に何か残っていると下は使われないと覚えておくと整理しやすいです(`・ω・´)
🔗 関連記事と使い分け
- Claude Codeのリモートエージェントで毎朝の定型作業を自動化:クラウドで定期実行するならこちら。手元の
claude -pとは認証の持ち方が違います - Claude CodeのWeb版(remote sessions)でスケジュール自動実行:Macをつけっぱなしにできない日の逃げ道として
- Claude Codeのauto modeで止まる人へ:無人で回すときの「許可で止まる」側の対策はこちら
パパ系Webエンジニア〜愛用ガジェット一覧 🛍️
AI開発・執筆に使っている作業デスク環境を楽天ROOMにまとめています ✨ デスク周りの参考にどうぞ 🙌
🙌 まとめ
claude -p を無人で回しているなら、2.1.318にしてから loginExpiresAt をログに残すだけで、朝の「全部止まってた」がかなり防げます。
やることは、claude auth status を先頭に置く・stderrを捨てない・ブラウザが開けない場所だけsetup-tokenにする、の3つです✅
これが良いのか悪いのか、AIに任せる仕事が増えるほど、こういう「動かし続けるための見張り」の方が大事になってきた気がします。笑
みんなは無人の実行、どうやって見張ってますか?(^^)
※ バージョン番号・提供範囲は今後も変わる可能性があります。最新情報は Claude Codeの公式ドキュメント と CHANGELOG をご確認ください👀