# 查看所有監聽埠口及 PID
netstat -ano | findstr :8080
# 輸出範例:
# TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1234
# 最後一欄 1234 即為 PID
# 根據 PID 查詢進程名稱
tasklist | findstr 1234
# 或使用 PowerShell (更詳細)
Get-Process -Id 1234 | Select-Object Id, ProcessName, Path
# 查看埠口佔用 (需 root 權限看所有進程)
sudo netstat -tlnp | grep :8080
# 或
sudo ss -tlnp | grep :8080
# 或
lsof -i :8080
# 輸出範例:
# java 1234 user 123u IPv6 12345 0t0 TCP *:8080 (LISTEN)
| 進程/服務 | 典型埠口 | 識別特徵 | 解決方案 |
|---|---|---|---|
| 另一個 Tomcat/Java 應用 | 8080, 8005, 8009 | java.exe / java 進程 | 關閉舊實例、修改 server.xml 埠口、使用不同實例目錄 |
| System (PID 4) | 80, 443 | PID 4, 進程名 System | 停用 "World Wide Web Publishing Service" (W3SVC) |
| IIS / HTTP.sys | 80, 443 | w3wp.exe, System | 停用 IIS、或配置 HTTP.sys URL ACL 共享埠口 |
| Skype | 80, 443 | Skype.exe | 設定 → 連線 → 取消 "使用埠 80 和 443" |
| Nginx/Apache | 80, 443, 8080 | nginx.exe, httpd.exe | 停止服務、修改 nginx.conf/httpd.conf 埠口 |
| Oracle DB | 8080 (XDB HTTP) | oracle.exe | 關閉 XDB HTTP 服務或修改埠口 |
| VMware Workstation | 80, 443 | vmware-hostd.exe | 編輯 → 偏好設定 → 共享 VM → 變更埠口 |
# 修改 $CATALINA_BASE/conf/server.xml
→ 改為 8081, 8082 等
# 同步修改關閉埠口 (避免多實例衝突)
→ 改為 8006, 8007 等
# AJP 埠口 (如不使用可註釋)
services.msc原理:HTTP.sys 核心驅動在 PID 4 (System) 下監聽,IIS/W3SVC 註冊 URL ACL 佔用埠口。
# 管理員 PowerShell 執行
# 允許特定用戶/群組在特定 URL 前綴監聽
netsh http add urlacl url=https://+:8080/myapp/ user=Everyone
# 查看現有 ACL
netsh http show urlacl
# 刪除 ACL
netsh http delete urlacl url=https://+:8080/myapp/
Tomcat 需配置 server.xml 的 address 和 path 對應。
# 停用佔用 80 埠的服務
sudo systemctl stop nginx
sudo systemctl disable nginx
# 或修改服務埠口
# /etc/nginx/nginx.conf: listen 8080;
sudo systemctl restart nginx
# 防火牆開放埠口
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
-p 8081:8080server.xmlShutdownHook 釋放埠口,避免 TIME_WAIT 積壓
# 大量 TIME_WAIT 導致埠口無法立即重用
netstat -an | findstr TIME_WAIT
# Windows 註冊表調優 (需重啟)
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
# TcpTimedWaitDelay = 30 (預設 240 秒,最小 30)
# MaxUserPort = 65534 (擴大可用埠口範圍)
# Linux 內核參數
# /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # NAT 環境慎用
net.ipv4.tcp_fin_timeout = 30
# sysctl -p 生效
# Windows: check_port.bat
@echo off
set PORT=%1
if "%PORT%"=="" set PORT=8080
echo 檢查埠口 %PORT% ...
netstat -ano | findstr :%PORT%
echo.
echo 對應進程詳細資訊:
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :%PORT%') do (
tasklist /fi "PID eq %%a" /fo list /v
)
pause
# Linux: check_port.sh
#!/bin/bash
PORT=${1:-8080}
echo "檢查埠口 $PORT ..."
sudo ss -tlnp | grep ":$PORT"
echo ""
echo "進程詳細資訊:"
sudo ss -tlnp | grep ":$PORT" | awk '{print $NF}' | cut -d= -f2 | xargs -r ps -fp