Claude Codeのdisk quota is fullとswap refusedの原因と対処
Bashが非ゼロ終了で出力も返さないとき、Claude Codeは一時領域の容量・inode・クォータを診断します。disk quota is fullとtask output swap refusedの意味と対処を分けて説明します。
Bashの結果にYour disk quota is full on the filesystem with Claude Code's temp directoryが出たら、原因はコマンドではなく一時ディレクトリの容量かクォータです。task output swap refusedが出たなら、一時ディレクトリの中身が別物にすり替わっています。どちらもBashの出力を置くファイルの問題で、直し方はCLAUDE_CODE_TMPDIRの付け替えが共通の逃げ道になります。
メッセージごとの意味と、手元で原因を確かめる順番をまとめます。
2つのメッセージは何が違うのか
Claude Codeは、BashとPowerShellで実行した各コマンドの出力を、一時ディレクトリ配下のファイルに保存します。Bash出力のインライン表示上限を超えた分がファイルに回る仕組みはbashOutputMaxCharsの記事にあります。ここで扱う2つは、その保存先ファイルを巡る別々の失敗です。
| 見るべき文言 | 起きていること | 主な対処 |
|---|---|---|
Your disk quota is full ... (EDQUOT) | 起きていること自分のクォータが上限に達した | 主な対処不要ファイルを消す / 一時領域を移す |
The filesystem ... or your disk quota on it, is full (ENOSPC) | 起きていることファイルシステムか自分のクォータに空きがない | 主な対処同上 |
Command output was lost: the temp filesystem at ... is full / is out of inodes | 起きていること空き容量かinodeがほぼ尽きた | 主な対処ファイルを多数消す / 一時領域を移す |
task output swap refused (tasks dir moved or linked) | 起きていること出力ファイルへの経路が、作成時と別物になった | 主な対処v2.1.260以降へ更新 / 一時領域を作り直す |
前の3行は容量の問題で、最後の1行は経路の整合性の問題です。容量が足りていても最後の1行は起きます。
disk quota is fullが出る条件と読み方
この診断は、コマンドが非ゼロで終了し、しかも出力がまったく無いときだけ走ります。そのときClaude Codeは、出力ファイルを置くファイルシステムの空き容量とinode、そして自分のディスククォータを調べます。該当すれば、空の出力の代わりに診断が結果に入ります。公式のエラー一覧にある例は次の形です。
Your disk quota is full on the filesystem with Claude Code's temp directory /private/tmp/claude-501/-Users-you-my-project/1f0e62dc-4b0a-4f5e-9c2d-8a7b6c5d4e3f/tasks (EDQUOT), so any output this command printed was lost, and it may have failed because it could not write. Delete files you no longer need there, or restart Claude Code with CLAUDE_CODE_TMPDIR set to a directory on another filesystem.括弧内のEDQUOTとENOSPCは、OSが返したエラーコードです。読み分けは次のとおりです。
EDQUOT: 自分に割り当てられたクォータが埋まっています。ファイルシステム全体には空きがあるように見えても起きますENOSPC: ファイルシステム、またはそこでの自分のクォータに空きがありませんtemp filesystem ... is full/is out of inodes: 空きがほぼ無いか、inodeが尽きかけています
文中の「出力は失われた」という点が重要です。切り詰められたのではなく、保存できずに消えています。コマンド自体も、書き込めなかったことが原因で失敗した可能性があります。
修正前は何が見えたか
changelogによると、v2.1.282で「BashとPowerShellが、満杯のディスククォータをExit code 1の裏に隠していた」問題が直っています。同じ修正で、一時領域に大きな出力ファイルが残る問題も扱われました。v2.1.282より前のバージョンでは、同じ状況が出力なしのExit code 1としか見えない可能性があります。診断文が出ずに原因が分からないときは、バージョンを確認してから次の手順に進みます。
手元で確かめる
一時ディレクトリの場所は、CLAUDE_CODE_TMPDIRの値に/claude-{uid}/(Windowsでは/claude/)を足したものです。未設定のときの基準はOSで違います。
| OS | 未設定時の基準 | 末尾に付く名前 |
|---|---|---|
| macOS | 未設定時の基準/tmp | 末尾に付く名前/claude-{uid}/ |
| Linux | 未設定時の基準os.tmpdir() | 末尾に付く名前/claude-{uid}/ |
| Windows | 未設定時の基準os.tmpdir() | 末尾に付く名前/claude/ |
os.tmpdir()の返す先は、環境変数TMPDIRやTEMPなどで変わります。dfで見る場所は、まずこの基準のパスを特定してから決めます。Claude Codeの外から、空きとinodeを見ます。
# 一時ディレクトリを含むファイルシステムの空き容量
df -h /tmp
# inode の空き
df -i /tmp
# 自分のクォータ(quota コマンドがある環境のみ)
quota -sdf -hに空きがあるのに失敗するなら、EDQUOTのとおりクォータ側を疑います。共有サーバーやホームを分割した環境では、クォータ超過がファイルシステムの空きと食い違います。df -iのIUse%が高いときは、数が多いファイルを消さないと戻りません。
対処は2通りです。
- 一時ディレクトリのあるファイルシステムで、不要なファイルを消す。
EDQUOTなら自分のクォータに数えられるファイルを消す。inode不足なら、大きなファイルを数本よりも小さなファイルを大量に消す(各ファイルが大きさに関係なくinodeを1つ使うため) CLAUDE_CODE_TMPDIRを、空きのある別のファイルシステム上のディレクトリに向けて再起動する
どちらの場合も、直したあとでClaudeにコマンドを実行し直させます。失われた出力は戻らないからです。
task output swap refusedが出る条件と読み方
こちらは容量とは無関係です。Claude Codeは出力ファイルを開くたびに、そのパスが自分の作ったファイルを指したままか確かめます。シンボリックリンク、余分なハードリンク、移動したディレクトリのどれかが経路に挟まっていれば、書き込みも読み出しも拒否します。
task output swap refused (tasks dir moved or linked): /private/tmp/claude-501/-Users-you-my-project/1f0e62dc-4b0a-4f5e-9c2d-8a7b6c5d4e3f/tasks/b7k2f9m3q.output. To recover: restart Claude Code with CLAUDE_CODE_TMPDIR set to a fresh directory; or, if /private/tmp/claude-501/-Users-you-my-project is a stray directory or a symbolic link that should not be there, remove that entry itself (not what it points to) and restart.例のパスは、一時ディレクトリの下に-Users-you-my-projectのようなプロジェクトごとのディレクトリがあり、その下にセッションごとのディレクトリとtasks、末尾にコマンドごとの.outputファイルが並ぶ形です。復旧手順で触るのは、このうちプロジェクトごとのディレクトリです。.outputファイルやtasksを手で直しても、すり替えの原因は残ります。
括弧内の文言が、落ちたチェックの名前です。output symlink was re-pointed、output file identity changed、not a regular fileなども同じ状態を指します。To recover:の一文が付くのは、一部の理由だけです。
コマンドの実行中にチェックが落ちると、Claude Codeはそのコマンドを止めます。結果には次の文が出ます。
Command killed: its output file was replaced or could no longer be verified止められたコマンドは途中で終わっているため、副作用のあるコマンドだったときは、再実行の前に実行結果を確かめます。
先に確認するのはバージョン
公式の対処の最初は、v2.1.260以降への更新です。それより前のバージョンは、リンクも移動も無いのにこのメッセージを出すことがありました。changelogにも関連する修正が2件あります。
| バージョン | 修正内容 |
|---|---|
| v2.1.252 | 修正内容一部のMacで、Bashコマンドがtask output swap refused (tasks dir moved or linked)で失敗する問題 |
| v2.1.260 | 修正内容多数のセッションが同じプロジェクトのディレクトリを共有するとき、断続的に出る問題 |
複数のセッションを同じリポジトリで並行して動かしている場合は、後者に当たりやすい構成です。どちらの症状でも、更新で消えないか先に確かめます。
更新しても出るとき
更新後も繰り返すなら、実際にすり替えが起きています。次の順で見ます。
- エラー文に出ている、プロジェクトごとのディレクトリ(例の
/private/tmp/claude-501/-Users-you-my-project)がリンクや想定外のディレクトリになっていないか調べる - リンクなら、リンク自体を消す。リンク先の中身を消さない
- Claude Codeを再起動する
# 例のパスを自分の環境のものに置き換える
ls -ld /private/tmp/claude-501/-Users-you-my-project
# シンボリックリンクなら、リンクそのものだけを消す(末尾に / を付けない)
rm /private/tmp/claude-501/-Users-you-my-projectls -ldの行頭がlならシンボリックリンクです。rm -rでリンク先まで巻き込まないよう、ここでは単純なrmにしています。
それでも繰り返すなら、セッションの実行中に、一時ディレクトリの下にあるものを別のプロセスが差し替えたり、リンクしたり、消したりしています。たとえば/tmpを定期的に掃除するジョブや、同期ツールのようなものが考えられます。犯人を特定できなくても、CLAUDE_CODE_TMPDIRを、ほかの何も管理していないディレクトリに向ければ避けられます。
CLAUDE_CODE_TMPDIRを付け替える
2つのエラーの対処に共通して出てくるのが、この環境変数です。Claude Codeが内部で使う一時ディレクトリを上書きし、Unix系では指定パスの下に/claude-{uid}/を作ります。仕様の詳細はCLAUDE_CODE_TMPDIRの解説にまとめてあります。
設定できる場所は、シェル、ユーザー設定、管理設定です。プロジェクト設定とローカル設定では無視されます。リポジトリの.claude/settings.jsonに書いても効かない点に注意します。
# 空きのある別ファイルシステム上に、他のジョブが触らない専用ディレクトリを作る
mkdir -p /data/cc-tmp
export CLAUDE_CODE_TMPDIR=/data/cc-tmp
claudeユーザー設定に固定するなら、~/.claude/settings.jsonのenvに書きます。
{
"env": {
"CLAUDE_CODE_TMPDIR": "/data/cc-tmp"
}
}変更は再起動後に効きます。実行中のセッションに途中から反映されるとは限らないので、エラーが出たセッションは一度閉じます。
付け替えたあとの$TMPDIRの扱い
付け替えても、Bashコマンドの中から見える$TMPDIRが、いつも指定したパスになるわけではありません。公式のenv-vars一覧には、次の挙動が載っています。
- サンドボックス化したBashの子プロセス(macOSとLinux)は、指定したパスが長いと、システム既定の場所の下にある短い
$TMPDIRを受け取ります。一部のツールが長い一時パスで失敗するためです - サンドボックス外のBashコマンドは、シェルに
$TMPDIRが設定されていればそれを引き継ぎます - ネイティブWindowsでシェルが
$TMPDIRを設定していないときは、$TMPDIRを参照するBashコマンドに、指定したパス(未指定なら%TEMP%)が渡ります - Claude Code自身の一時ファイルは、常に指定したパスを使います
つまり、コマンドが自分で書いたファイルをdfで探しても、Claude Codeの出力ファイルの置き場所とは別のファイルシステムだった、ということが起こります。容量不足を疑うときは、Claude Codeの出力ファイルがある指定パス側を見ます。
見分けにくいほかの原因との切り分け
出力が空になる症状は、ここで扱った2つだけが原因ではありません。次の順に見ると、無駄な再起動を減らせます。
- 診断文が出ている: 上の2つのどちらかです。文言で表の行を選びます
- 診断文が無く、
Exit code 1だけ: v2.1.282より前なら、満杯のクォータが隠れている可能性があります。更新して再現するか、dfとquotaで確かめます - WindowsのGit Bashで
npmなどだけ出力が空: 一時領域ではなく、シェル側の問題の可能性があります。Git Bashで出力が空になる場合の切り分けを参照します - 一時ディレクトリが空のサブディレクトリだらけ: 容量の問題ではなく、書き込み先ディレクトリの残骸です。.cc-writesの掃除手順にあります
容量不足で失敗するコマンドは、Claudeが何度再実行しても同じ結果になります。同じコマンドを繰り返し試している様子が見えたら、いったん止めて、原因が一時領域にないか確認します。
まとめ
disk quota is fullは容量・inode・クォータの枯渇で、出力は失われています。task output swap refusedは出力ファイルへの経路のすり替えで、まずv2.1.260以降に更新します。どちらも直らなければ、CLAUDE_CODE_TMPDIRを空きのある専用ディレクトリに向けて再起動する形に落ち着きます。