修复 Ollama 端口被占用 (11434)

Ollama 因 11434 端口被占用而无法启动。教你定位占用进程、释放端口,或把 Ollama 换到其他端口——macOS、Linux、Windows 的精确命令。

你执行 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-WAITStep 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> 杀掉,再到任务管理器禁用那个启动项,免得它自动启动。

相关阅读

标签: #local-llm #ollama #排查