原文(日本語に翻訳)
ターミナルが閉じられた際にClaude Codeプロセスが残留する問題を修正しました。process.exit() からのEIOエラーをキャッチし、フォールバックとしてSIGKILLを使用するようにしました。
原文(英語)
Fixed dangling Claude Code processes when terminal is closed by catching EIO errors from process.exit() and using SIGKILL as fallback
概要
Claude Code v2.1.19で、ターミナルを強制終了した際にClaude Codeのプロセスがバックグラウンドで残り続けてしまう問題が修正されました。この問題は、ターミナルエミュレータが予期せず閉じられた場合やSSH接続が切断された場合に、プロセスが適切にクリーンアップされずにゾンビプロセスとして残留していました。
v2.1.19では、process.exit() からのEIO(Input/Output Error)エラーを適切にキャッチし、通常の終了処理が失敗した場合はSIGKILLシグナルを使用して強制終了することで、確実にプロセスを終了させるようになりました。
問題が発生していたシナリオ
ターミナルの強制終了
- ターミナルウィンドウを×ボタンで強制的に閉じた場合
- 「強制終了」でターミナルアプリを終了した場合
- システムシャットダウン時にターミナルが強制終了された場合
SSH接続の切断
# SSHでリモートサーバーに接続してClaude Codeを実行
ssh user@remote-server
cd /project
claude
# ネットワーク切断や接続タイムアウトが発生
# → 以前のバージョンでは Claude Code プロセスが残留CI/CD環境での強制終了
# GitHub Actions
jobs:
review:
runs-on: ubuntu-latest
timeout-minutes: 10 # タイムアウト設定
steps:
- run: claude -p "Review this code"
# タイムアウト時にプロセスが残留していた修正による改善
プロセスの確実な終了
v2.1.19以降では、以下の2段階終了メカニズムで確実にクリーンアップされます:
- 通常の終了処理:
process.exit()による正常終了を試行 - フォールバック処理: EIOエラーが発生した場合はSIGKILLで強制終了
リソースリークの防止
残留プロセスによる問題を防止:
- メモリ使用量: ゾンビプロセスによるメモリ消費を防止
- CPU使用率: バックグラウンドで動作し続けることによるCPU負荷を回避
- ファイルディスクリプタ: 開いたままのファイルやネットワーク接続を適切にクローズ
- プロセス数制限: システムのプロセス数上限に達することを防止
実践例
ターミナルの安全な使用
以前は残留プロセスの心配がありましたが、v2.1.19以降は安心して使用できます:
# Claude Codeを起動
claude
# 作業中...
# ターミナルを×ボタンで閉じても
# → プロセスは確実に終了しますSSH経由でのリモート作業
ネットワーク切断時も安全:
# リモートサーバーでの作業
ssh user@production-server
claude -p "Deploy the latest changes"
# SSH接続が突然切れても
# → Claude Codeプロセスは適切に終了プロセス監視の必要性が減少
以前は定期的なプロセス監視が必要でしたが、v2.1.19以降は不要に:
# 以前: 残留プロセスの確認と削除が必要だった
ps aux | grep claude
pkill -9 claude
# v2.1.19以降: 自動的にクリーンアップされる
# 手動での介入は不要CI/CD環境での安定性向上
タイムアウトやキャンセル時も安全:
# GitHub Actions
jobs:
code-review:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Install Claude Code
run: curl -fsSL https://claude.ai/install.sh | bash
- name: Run review
run: claude -p "Review changes for security issues"
# タイムアウトやジョブキャンセル時も
# プロセスが確実に終了するDocker/コンテナ環境
コンテナ停止時のクリーンな終了:
# Dockerコンテナ内でClaude Codeを実行
docker run -it my-dev-env claude
# コンテナを停止
docker stop <container-id>
# → Claude Codeプロセスは適切にクリーンアップされるトラブルシューティング
残留プロセスの確認方法
もし古いバージョンでプロセスが残留している場合:
# Claude Codeプロセスの確認(Linux/macOS)
ps aux | grep "claude"
# プロセス数の確認
pgrep -c claude
# 詳細情報の表示
pgrep -a claude残留プロセスの手動削除
v2.1.19より前のバージョンで残留したプロセスを削除:
# すべてのClaude Codeプロセスを終了(注意: 実行中のセッションも終了します)
pkill claude
# より確実な強制終了
pkill -9 claude
# または特定のPIDを指定
kill -9 <PID>アップグレード推奨
この問題を根本的に解決するには、v2.1.19以降にアップグレードしてください:
# Claude Codeをアップデート
claude update
# バージョン確認
claude --version
# v2.1.19以上であることを確認技術的な詳細
EIOエラーとは
EIO (Input/Output Error) は、入出力操作が失敗したことを示すエラーです。ターミナルが予期せず閉じられると、標準入出力へのアクセスが失敗し、このエラーが発生します。
SIGKILLフォールバック
- SIGTERM/SIGINT: 通常の終了シグナル(プロセスが無視できる)
- SIGKILL: 強制終了シグナル(プロセスが無視できない、カーネルが即座に終了させる)
v2.1.19では、通常の終了が失敗した場合にSIGKILLを使用することで、どのような状況でもプロセスが確実に終了するようになりました。
注意点
- バージョン確認: この修正はv2.1.19で導入されました。それより前のバージョンでは問題が発生する可能性があります
- 正常終了を優先: 可能な限りCtrl+Dやexitコマンドでの正常終了を推奨します
- セッションの保存: 強制終了前に重要な作業は保存するか、セッションに名前を付けておくことを推奨します