☰
Linux 上跑 Claude Code 服务器宕机避坑:swap 与 config.toml 配置记录
2026/9/29 21:31:55 网站建设 项目流程

1. 低配 Linux 跑 Claude Code 为什么会把服务器打挂

如果你在 2GB 内存的云服务器上跑 Claude Code,大概率会遇到一个很典型的现象:SSH 突然卡死、top刷不出来、网站 502,最后只能去控制台强制重启。这不是 Claude Code 本身有 bug,而是它作为一个常驻的 Node 进程,在内存吃紧时会把整台机器拖垮。

Claude Code 能做什么?简单说,它是一个跑在终端里的 AI 编码助手,能读你项目里的文件、执行命令、改代码。适合谁?适合习惯命令行、想把手头项目交给 AI 边聊边改的开发者。但它对运行环境有基本要求:Node 运行时、稳定的网络出口、以及足够的内存余量。当这三样里任何一样出问题,低配服务器就会先崩为敬。

我踩过的坑是这样的:一台 2GB 内存的轻量服务器,白天挂着 Claude Code 做重构,晚上忘了关。第二天发现机器失联,控制台一看内存曲线是一条直线顶到天花板。重启后查日志,发现进程数从几十涨到了几百,全是 Claude Code 派生出来的子进程。核心原因有两个:一是网络出口不稳定时,客户端会不断重试连接,每次重试都可能拉起新的进程或线程,旧的没被及时回收;二是 2GB 内存本身没有 swap 兜底,物理内存一满,内核的 OOM Killer 就开始乱杀,杀到关键系统进程,机器就彻底没响应了。

所以这篇记录不讲怎么装 Claude Code,而是聚焦两件事:怎么用 swap 给内存加一层缓冲,怎么用config.toml把资源占用和接入通道固定下来,避免它失控。下面给的都是可以直接复制执行的命令和配置骨架。

2. 前置准备:用 TaoToken 统一 Key 与 API 通道

在调 swap 之前,先把接入层理顺。Claude Code 默认会直连官方端点,如果你的服务器网络出口不稳定,重试风暴就是从这里来的。更稳的做法是走一个统一的 API 通道,把 Key 和 Base URL 固定下来,减少客户端因为鉴权失败或连接超时而反复重试的概率。

TaoToken 在这里扮演的角色就是统一入口:你拿到一个 Key,配好 Base URL,Claude Code 的所有请求都走这个通道。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。注意 API 地址后面不加任何查询参数,直接填进配置里就行。

你需要先拿到 Key。登录后进控制台,在 API Keys 页面创建一个新 Key,复制出来。这个 Key 后面会写进config.toml,所以别贴在聊天窗口里,直接存到服务器的环境变量或配置文件里。

提示:Key 只显示一次,创建后立刻保存。如果怀疑泄露,直接在控制台删掉重建,不要试图找回。

拿到 Key 之后,先别急着跑 Claude Code,用一条 curl 验证通道是否通。这一步能排除掉大部分“连不上导致重试”的问题:

export TAOTOKEN_API_KEY="你的Key" curl -sS https://taotoken.net/api/v1/models \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" | head -c 500

如果返回一段 JSON,里面有模型列表,说明通道正常。如果返回 401,检查 Key 有没有复制全;如果超时,先查服务器 DNS 和出网策略,别往下走。

3. 可复制配置:swap 调整与 config.toml 骨架

3.1 先加 4GB swap 兜底

2GB 物理内存的机器,建议直接加 4GB swap。命令如下,逐条执行:

sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

执行完用free -h确认,Swap 那一行应该显示 4.0Gi。然后写入/etc/fstab让它开机自动挂载:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

再调两个内核参数,让 swap 更积极一点,同时降低内存回收的激进程度:

sudo sysctl vm.swappiness=60 sudo sysctl vm.vfs_cache_pressure=50 echo 'vm.swappiness=60' | sudo tee -a /etc/sysctl.conf echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf

vm.swappiness=60表示内存用到六成左右就开始往 swap 挪,默认值 60 其实够用,但有些云镜像默认是 0 或 10,那样物理内存满了才会动 swap,来不及。vfs_cache_pressure=50让内核少回收目录项缓存,对文件操作多的场景更友好。

3.2 config.toml 骨架

Claude Code 的配置文件一般放在~/.config/claude-code/config.toml或项目根目录的.claude/config.toml。下面这份骨架把接入通道、超时和并发都固定住:

# ~/.config/claude-code/config.toml [api] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" timeout_seconds = 60 max_retries = 2 [model] default = "claude-sonnet-4-20250514" max_tokens = 8192 [process] max_concurrent_requests = 2 idle_timeout_seconds = 300

几个关键点解释一下。base_url指向 TaoToken 的 API 地址,不带任何多余参数。api_key_env表示从环境变量读 Key,不要把 Key 明文写进文件。max_retries = 2是重点:默认重试次数可能很高,网络抖动时会疯狂拉起新请求,把它压到 2 次,配合 60 秒超时,能显著减少进程堆积。max_concurrent_requests = 2限制并发,低配机器别开太高。

把环境变量写进 shell 配置,避免每次手动 export:

echo 'export TAOTOKEN_API_KEY="你的Key"' >> ~/.bashrc source ~/.bashrc

3.3 用 systemd 限制资源上限

如果你把 Claude Code 做成 systemd 服务,加一层资源限制,防止它吃光内存:

[Service] MemoryLimit=1G CPUQuota=50%

执行sudo systemctl edit claude-code.service,把上面两行贴进去,保存后sudo systemctl daemon-reload && sudo systemctl restart claude-code。这样即使它想膨胀,也被硬限制在 1GB 内存和 50% CPU 以内,OOM Killer 不会去动系统进程。

4. 验证请求与成功结果

配置改完,先做一次最小验证。启动 Claude Code,发一条最简单的请求:

claude -p "用一句话说明当前目录下有几个文件"

如果配置正确,你会看到它返回一句描述,同时终端没有卡顿。这时候另开一个 SSH 窗口,跑free -h和ps aux | grep -c claude,观察内存和进程数。正常情况下,内存占用应该在几百 MB 以内,进程数稳定在个位数。

再验证一下 swap 是否真的在工作。用swapon --show确认/swapfile在列表里,类型是 file,大小 4G。然后跑一个稍微重一点的任务,比如让它读一个中等大小的项目目录:

claude -p "列出当前项目里所有 .py 文件,并统计行数"

执行过程中用watch -n 1 free -h盯着,你会看到 used 内存上升,但 swap 那一列也开始有数字,说明缓冲层生效了。任务结束后,内存会慢慢回落,不会出现进程数暴涨的情况。

如果你走的是 TaoToken 通道,还可以在控制台的用量页面看到这次请求的记录,确认请求确实经过了统一入口。这一步能帮你区分“是客户端重试”还是“是通道侧限流”,排障时很有用。

5. 本篇常见错排查

报错一:swapon: /swapfile: swapon failed: Invalid argument通常是文件系统不支持,或者 fallocate 出来的文件有空洞。改用dd创建:

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

报错二:401 Unauthorized反复出现先确认环境变量有没有生效:echo $TAOTOKEN_API_KEY。如果为空,说明~/.bashrc没 source,或者你用的是 zsh,要写进~/.zshrc。另外检查config.toml里api_key_env拼写是否和变量名一致。

报错三:Claude Code 启动后进程数持续上涨把max_retries降到 1,timeout_seconds降到 30,再观察。如果还是涨,检查是不是有多个 Claude Code 实例同时在跑,用pkill -f claude清掉再重启。低配机器上,同时开两个实例基本等于自杀。

报错四:机器还是卡死,但 swap 没满这时候看dmesg | tail -50,找 OOM Killer 的记录。如果杀的是 node 进程,说明 MemoryLimit 没生效,检查 systemd 配置有没有正确 reload。如果杀的是 mysql 或 nginx,说明你的服务本身内存就紧张,Claude Code 只是压垮骆驼的最后一根稻草,得先给其他服务做资源隔离。

报错五:config.toml改了不生效Claude Code 可能读的是项目级配置而不是用户级。确认一下当前目录有没有.claude/config.toml,它的优先级更高。用claude config list可以打印当前生效的配置项,对照检查。

6. 稳定运行的接入与验证入口

把 swap、config.toml、systemd 限制这三层配好之后,低配 Linux 服务器跑 Claude Code 的稳定性会有明显改善。核心思路就一句话:用 swap 兜底物理内存,用配置压住重试和并发,用统一通道减少网络层的不确定性。

如果你还没配 Key,或者想换一个更稳的接入通道,可以从 API Keys 页面创建一个新 Key,然后对照接入文档把base_url和api_key_env填进config.toml。验证模型是否通的时候,直接用模型对话发一条短请求,看返回是否正常。长期在服务器上跑编码任务的话,可以了解一下 Coding Plan,把用量和并发规划清楚,避免月底才发现额度超了。

最后提醒一句:生产环境别直接跑 Claude Code,哪怕你只是临时改个配置。给它单独开一台低配机器,或者至少用 systemd 把资源圈死。真出了 P0,重启解决不了根因,swap 和配置才是那道防线。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询