
020、配置调试与故障诊断claude config 诊断命令与 10 个常见错误的修复方案从一次凌晨的CI挂掉说起凌晨两点告警群炸了。CI流水线里Claude Code的agent任务全部超时日志里只有一行“Error: Failed to load config”。我ssh上去跑了一遍claude config diagnose输出里赫然写着“API key not found in any expected location”。但.env文件明明在那里权限也对。折腾了半小时才发现——新上线的K8s节点把/home/user挂载成了临时卷重启后.env被清空了。那次之后我把claude config的诊断命令刻进了肌肉记忆。今天这篇笔记就是从那晚的血泪史里提炼出来的。claude config diagnose你的第一把手术刀别等出问题才想起它。每次修改配置后养成习惯跑一遍claude config diagnose这个命令会扫描五个层级系统级/etc/claude/config、用户级~/.claude/config、项目级.claude/config、环境变量、运行时参数。输出格式类似这样[OK] System config: /etc/claude/config [WARN] User config: ~/.claude/config (permissions 644, expected 600) [FAIL] Project config: .claude/config (file not found) [OK] Environment: CLAUDE_API_KEY set [OK] Runtime args: --model claude-sonnet-4-20250514注意那个[WARN]——权限644意味着其他用户能读你的API key。这里踩过坑某次我把~/.claude/config设成了644同事的脚本不小心读到了我的key导致计费混乱。正确做法是chmod 600。诊断命令还会检查配置文件的YAML语法。如果某个字段缩进错了它会精确指出行号。比如[FAIL] YAML parse error at line 23, column 5: mapping values are not allowed here别慌多半是某个冒号后面忘了空格。我见过最离谱的有人把max_tokens: 4096写成了max_tokens:4096少了那个空格YAML直接炸了。10个常见错误与修复方案1. API Key 找不到现象Error: Authentication failed. No API key provided.根因Claude Code按优先级查找环境变量CLAUDE_API_KEYANTHROPIC_API_KEY~/.claude/config中的api_key字段 .env文件。修复先确认你设了哪个。我习惯用环境变量因为CI里最干净exportCLAUDE_API_KEYsk-ant-...# 别这样写export CLAUDE_API_KEY sk-ant-... 等号两边不能有空格这里踩过坑如果用了.env确保它在当前工作目录且Claude Code进程能读到。Docker里跑的话记得--env-file。2. 模型名称写错现象Error: Invalid model: claude-sonnet-4-20250514-extra根因模型名称有严格格式多一个字符都不行。修复去官方文档查最新列表。我踩过的坑把claude-sonnet-4-20250514写成了claude-sonnet-4-20250514-beta多了一个-beta。正确的做法是直接复制文档里的字符串别手打。3. max_tokens 超出限制现象Error: max_tokens must be between 1 and 8192根因不同模型有不同上限。Sonnet 4是8192Opus 4是4096。修复别写死。我习惯在配置里用变量# .claude/configmax_tokens:${MODEL_MAX_TOKENS:-4096}然后在CI里根据模型动态设环境变量。这样换模型时不用改配置文件。4. 代理配置错误现象Error: connect ECONNREFUSED 127.0.0.1:8080根因http_proxy或https_proxy设了但代理没启动。修复检查代理地址。我见过最坑的有人把http://proxy.company.com:3128写成了http://proxy.company.com:3128/多了一个斜杠。Claude Code的HTTP客户端对URL格式很敏感。如果不需要代理显式清空unsethttp_proxy https_proxy# 别这样写export http_proxy 空字符串会被当成有效代理5. 并发数设置过高现象Error: Rate limit exceeded. Retry after 60 seconds.根因max_concurrent_requests设太大触发了API限流。修复根据你的API tier来设。Tier 1用户建议max_concurrent_requests: 2Tier 4可以到10。我一般从3开始观察claude config diagnose输出的rate_limit_remaining字段逐步往上调。6. 日志级别导致性能问题现象任务执行慢磁盘空间暴涨。根因log_level: debug在生产环境开着每秒写几百MB日志。修复开发时用debug生产用info或warn# .claude/configlog_level:${LOG_LEVEL:-warn}log_file:/var/log/claude/agent.log注意日志轮转。我见过有人没设log_max_size一个月后日志文件占了200GB。加上这个log_max_size:100MBlog_max_files:57. 工作目录权限问题现象Error: Permission denied: /data/claude/workspace根因Claude Code需要在工作目录创建临时文件和缓存。修复确保运行用户有写权限。Docker里常见错误是用了USER 1000但目录属于rootRUN mkdir -p /data/claude/workspace chown -R 1000:1000 /data/claude USER 10008. 配置文件编码问题现象Error: Invalid UTF-8 sequence at line 1根因配置文件是GBK或Latin-1编码Claude Code只认UTF-8。修复用file命令检查编码file-i.claude/config# 输出应该是text/plain; charsetutf-8如果是charsetiso-8859-1转码iconv-fISO-8859-1-tUTF-8 .claude/config.claude/config.utf8mv.claude/config.utf8 .claude/configWindows用户特别容易踩这个坑因为记事本默认存ANSI编码。9. 环境变量覆盖顺序混乱现象明明在.env里设了CLAUDE_MODELclaude-opus-4-20250514但实际用的是Sonnet。根因环境变量优先级高于.env但低于命令行参数。如果你在shell里export了一个旧值它会覆盖.env。修复用env | grep CLAUDE检查当前环境。我习惯在脚本开头显式清理unsetCLAUDE_MODELsource.env# 现在.env里的值生效了10. 缓存目录冲突现象Error: Cache directory /tmp/claude-cache is not writable根因多个Claude Code实例共享同一个缓存目录权限冲突。修复每个实例用独立缓存# .claude/configcache_dir:/tmp/claude-cache-${HOSTNAME}或者用进程IDcache_dir:/tmp/claude-cache-$$注意$$在YAML里会被shell展开但Claude Code的配置解析器也支持环境变量展开所以没问题。诊断命令的高级用法claude config diagnose有几个隐藏参数文档里没写# 输出JSON格式方便脚本解析claude config diagnose--formatjson# 只检查特定层级claude config diagnose--scopeproject# 验证远程配置如果用了配置中心claude config diagnose--remotehttps://config.internal/claude我写了个小脚本每天凌晨跑一次诊断结果推送到Prometheus#!/bin/bash# 别这样写if [ $(claude config diagnose --format json | jq .status) FAIL ]# 这里踩过坑jq的输出带引号要用-r去掉if[$(claude config diagnose--formatjson|jq-r.status)FAIL];thencurl-XPOST-HContent-Type: application/json\-d{alert: Claude config broken}\http://alertmanager:9093/api/v1/alertsfi个人经验配置即代码最后说点实在的。别把配置当一次性工作。我见过太多团队配置写好了就扔在那直到CI炸了才想起来检查。我的做法是配置模板化.claude/config.template放在Git里用envsubst生成实际配置。这样敏感信息API key不会进版本控制。配置测试CI里加一步claude config diagnose如果返回FAIL就阻断流水线。别等到运行时才报错。配置审计每周跑一次claude config diagnose --format json把结果存到Elasticsearch。这样能回溯配置变更历史定位问题根因。配置回滚每次修改配置前备份当前版本。我习惯用cp .claude/config .claude/config.$(date %Y%m%d%H%M%S)。出问题秒级回滚。那次凌晨的故障之后我在所有Claude Code部署节点上加了一个systemd timer每小时跑一次诊断结果异常就发告警。从那以后配置问题再也没在半夜出现过。记住配置调试不是事后诸葛亮而是事前预防针。claude config diagnose是你的第一道防线别等出事了才想起它。