你执行 ollama serve(或启动 Ollama 桌面应用),立刻遇到下面其中一种报错:
- macOS / Linux:
Error: listen tcp 127.0.0.1:11434: bind: address already in use - Windows:
Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
服务起不来,ollama run <model> 也会因连不上而失败。Ollama 默认绑定 127.0.0.1:11434(截至 2026 年 6 月,官方 FAQ 仍是这个默认值),这条报错的意思就是:这个端口已经被别的东西占着了。
最快的解决办法: 绝大多数情况下,占端口的”别的东西”其实是你忘了它还开着的另一个 Ollama——桌面应用或后台/服务实例。这时你根本不需要 ollama serve,直接 ollama run <model>,让已经在跑的那个实例响应即可。如果确实要重启,先用 lsof -i :11434(macOS/Linux)或 netstat -ano | findstr :11434(Windows)找出占用者,停掉它,然后只启动一个实例。
先判断你属于哪种情况
先按你的系统运行下面这条命令,再对照表格匹配输出。
# macOS / Linux
lsof -i :11434 -P -n
# Windows(PowerShell)——记下最后一列的 PID
netstat -ano | findstr :11434
| 你看到的输出 | 最可能的原因 | 对应步骤 |
|---|---|---|
占用者是 ollama / ollama.exe,且你启动过应用或服务 | 桌面应用或服务已经在提供服务 | Step 2A——别再 ollama serve,直接 ollama run |
占用者是 ollama,没启动过应用/服务,上次是强退终端 | 残留的 ollama serve 进程 | Step 2B——杀掉它 |
systemctl is-active ollama 返回 active(Linux) | systemd 服务占着端口 | Step 2C——用 systemctl 管理,别手动 serve |
占用者不是 ollama(是别的程序) | 真正的端口冲突 | Step 3——把 Ollama 换到其他端口 |
lsof 查不到进程,但仍报错约 30-60 秒 | 崩溃/kill -9 后套接字处于 TIME-WAIT | Step 4——等它释放 |
存在两个 ollama 程序(应用 + Homebrew,或 Windows 开机自启项) | 重复安装且都自动启动 | Step 5——只保留一个 |
Step 1:找出占用 11434 端口的进程
# macOS / Linux
lsof -i :11434 -P -n
# Linux 另一种方式(显示 PID 和进程名)
ss -tlnp | grep :11434
# Windows(PowerShell):先拿到 PID,再把它解析成进程名
netstat -ano | findstr :11434
Get-Process -Id <PID>
如果 COMMAND / 进程名是 ollama(或 ollama.exe),说明是某个 Ollama 实例——转到 Step 2。如果是其他名字,转到 Step 3。
Step 2A:是 Ollama 应用或服务——不要重复 serve
这是最常见的情形。macOS/Windows 桌面应用和 Linux systemd 服务各自会在后台跑一个 server。你再用 ollama serve 起第二个,就会触发这条报错。
应用/服务在跑时,你根本不需要 ollama serve,直接用客户端命令即可:
ollama run llama3.2
ollama pull qwen3
确认已有的 server 是否健康:
curl -s http://localhost:11434/api/version
Step 2B:是残留的 ollama serve——杀掉它
上一次的 ollama serve 还占着端口,通常是因为终端被强制关闭,而不是用 Ctrl+C 正常停止(Ctrl+C 会发 SIGINT,让它释放套接字)。
# macOS / Linux——先优雅终止
kill -15 "$(lsof -ti :11434)"
sleep 2
lsof -i :11434 # 预期无输出
# 如果还活着,强制终止
pkill -9 -f ollama
# Windows(PowerShell):用 Step 1 里的 PID
taskkill /F /PID <PID>
macOS 上要特别注意:从菜单栏退出桌面应用(点 Ollama 图标 -> Quit Ollama)是官方支持的停止方式,但有个已知小毛病——退出后 server 进程可能仍在跑,而且没有 Dock 图标。如果退出后 lsof -i :11434 仍显示 ollama,就退而用 pkill -9 -f ollama,或在”活动监视器”里搜 “ollama”、选中后点停止按钮。然后干净地重启:
ollama serve
Step 2C:Linux——用 systemd 管理,别手动 serve
Linux 安装脚本会注册 ollama.service 并开机自启。如果它处于 active,手动 ollama serve 永远抢不到端口。
systemctl is-active ollama # 返回 "active" 即服务占着 11434
# 通过 service unit 重启或停止,而不是直接 kill PID
sudo systemctl restart ollama
sudo systemctl stop ollama
# 只有需要前台/调试运行时,先停服务再手动 serve
sudo systemctl stop ollama
OLLAMA_DEBUG=1 ollama serve
如果你更想一直手动运行,就禁用服务,让它开机时不再抢端口:
sudo systemctl disable --now ollama
Step 3:是别的程序占着 11434——给 Ollama 换端口
如果 Step 1 显示占用者不是 ollama(某个开发工具、Docker 端口映射、或散落的脚本),最干净的做法是通过 OLLAMA_HOST 给 Ollama 单独分一个端口。
临时跑一次:
OLLAMA_HOST=127.0.0.1:11435 ollama serve
要让它长期生效,就按各平台 Ollama 真正读取该变量的方式来设置(依据官方 FAQ,2026 年 6 月):
# Linux(systemd):编辑 unit,加上 env 行,再 reload
sudo systemctl edit ollama.service
# [Service]
# Environment="OLLAMA_HOST=127.0.0.1:11435"
sudo systemctl daemon-reload
sudo systemctl restart ollama
# macOS(桌面应用):为启动环境设置该变量,然后重启应用
launchctl setenv OLLAMA_HOST "127.0.0.1:11435"
Windows 上:从系统托盘退出 Ollama,打开 Edit environment variables for your account(编辑账户的环境变量),新增用户变量 OLLAMA_HOST、值为 127.0.0.1:11435,再从开始菜单重新启动 Ollama。
然后把所有客户端都指向新端口:
# 当前 shell 里的 CLI
export OLLAMA_HOST=127.0.0.1:11435
ollama run llama3.2
# Open WebUI: OLLAMA_BASE_URL=http://localhost:11435
# LangChain: OllamaLLM(base_url="http://localhost:11435")
curl http://localhost:11435/api/version
Step 4:崩溃后套接字卡在 TIME-WAIT
如果你是硬杀了 Ollama(OOM killer、kill -9、断电),现在 lsof -i :11434 已经查不到进程,但绑定还是会失败半分钟,那是内核在 TIME-WAIT 状态下保留套接字,等待途中的数据包排空。
# 确认状态
ss -tan | grep 11434 # 看是否是 TIME-WAIT(而不是 LISTEN)
解决办法就是等:套接字会自动释放,通常 60 秒内。之后再 ollama serve 就能成功。对正常的单实例场景,没必要去调内核 sysctl 参数——状态清掉后重试一次即可。
Step 5:装了两个 Ollama 且都自动启动——只留一个
如果刚重启完 lsof 仍然显示 ollama,多半是你装了两份、且都会自启。
- macOS: 桌面应用和
brew install ollama是两个独立的二进制,选一个就好。运行which ollama,再看/Applications里有没有Ollama.app。想保留应用就brew uninstall ollama;想保留 Homebrew 就把Ollama.app移到废纸篓。 - Windows: 安装程序会在任务管理器 -> 启动应用 (Startup apps) 里加一项,悄悄拉起
ollama.exe并占住 11434,哪怕托盘里看不到图标。想自己掌控启动就在那里禁用这一项;否则干脆别跟它较劲,直接用ollama run。
如何确认已修复
# 1)端口上只有一个占用者
lsof -i :11434 # (Windows 用:netstat -ano | findstr :11434)
# 2)API 能响应
curl -s http://localhost:11434/api/version
# 3)模型真能回话
ollama run llama3.2 "say hi in one word"
三项都通过,端口冲突就解决了。
预防建议
- 桌面应用或 systemd 服务已经在跑时,别再手动
ollama serve——直接ollama run/ollama pull,让现有 server 响应。 - Linux 上统一用
systemctl(start/stop/restart)管理 Ollama,别混入手动serve。 - macOS 上在应用和 Homebrew/手动安装之间二选一,别两个都装。Windows 上想清楚是让”启动应用”还是你的终端来掌管这个进程——别两边都开。
- 启动脚本里先判端口是否空闲:
lsof -i :11434 -t >/dev/null || ollama serve。 - 崩溃后等约 60 秒再重启,让残留的
TIME-WAIT套接字先清掉。 - 在项目的
.env.example里固定OLLAMA_HOST,让队友知道端口、能尽早发现冲突。
常见问答 (FAQ)
Q:能在一台机器上同时跑两个 Ollama 实例吗?
A:可以——给第二个分配不同端口,例如 OLLAMA_HOST=127.0.0.1:11435 ollama serve。每个实例有各自的已加载模型池,可以同时提供不同模型。若还想分开存储模型,给每个实例再设不同的 OLLAMA_MODELS 路径。
Q:进程已经杀了,但还是报 “address already in use” 约 30 秒,为什么?
A:TCP 套接字在强制关闭后进入了 TIME-WAIT。用 ss -tan state time-wait | grep 11434 确认。它会自动释放,等 30-60 秒再重试即可。别反复 kill -9——那只会把计时器重置。
Q:ollama serve 起来了,但 ollama run 还是 “connection refused”,为什么?
A:CLI 连的是 OLLAMA_HOST 指向的地址(默认 http://localhost:11434)。如果你把 server 起在了自定义端口(比如 11435),就要在同一个 shell 里、运行 ollama run 之前先 export OLLAMA_HOST=127.0.0.1:11435,否则客户端会一直去敲 11434。
Q:怎么把 Ollama 暴露到局域网,又不绑 0.0.0.0?
A:设 OLLAMA_HOST=<你的局域网IP>:11434(例如 192.168.1.50:11434)。这样只绑那一个网卡,避免 0.0.0.0 监听所有网卡时与 Docker 端口映射相撞。暴露前记得先加防火墙规则。
Q:Windows 上没有托盘图标,但端口还是被占着,是什么在占?
A:安装程序的启动应用 (Startup apps) 项会在后台拉起 ollama.exe,没有可见的托盘图标。用 netstat -ano | findstr :11434 找到它,taskkill /F /PID <PID> 杀掉,再到任务管理器禁用那个启动项,免得它自动启动。
相关阅读
- Ollama 下载模型卡在某个百分比
- Ollama 探测不到 GPU,全跑在 CPU
- Ollama pull 成功但 list 看不到
- Ollama Modelfile 里的 SYSTEM prompt 被忽略
- Claude MCP server 断连
标签: #local-llm #ollama #排查