Linux 释放被占用端口:查找并终止占用进程

> 原文:[How to Close an Open Port by Killing a Process in Linux](https://www.tecmint.com/kill-process-using-port-linux/) > 来源:Tecmint > 作者:Ravi Saive > 发布时间:2026-05-19 > 本文用途:把原文整理成便于保存和分享的中文 HTML 摘要。

一句话总结

当 Linux 服务启动时报 Address already in use,正确处理方式是:先查清哪个进程占用了端口,再优雅终止;只有在无效时才使用 kill -9 强制结束。

典型场景

你重启服务时发现端口被占用,例如服务要监听 8080,但系统提示:

Address already in use

这通常说明已经有进程在监听该端口。处理流程不应该是盲目杀进程,而是:

1. 找到占用端口的进程。 2. 确认进程名称和 PID。 3. 优先发送 SIGTERM 让进程正常退出。 4. 如果进程不响应,再考虑 SIGKILL。 5. 重新检查端口是否释放。

方法一:用 lsof 查端口占用

查看 8080 端口:

sudo lsof -i :8080

示例输出:

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node     3821    ravi   22u  IPv6  54312      0t0  TCP *:8080 (LISTEN)

重点字段:

sudo 很重要,因为没有 root 权限时,可能只能看到当前用户自己的进程。

方法二:用 ss 查端口占用

如果系统没有 lsof,可以使用现代 Linux 常见的 ss

sudo ss -tulnp | grep :8080

参数含义:

示例输出:

tcp   LISTEN 0  128   0.0.0.0:8080   0.0.0.0:*   users:(("node",pid=3821,fd=22))

这里的 pid=3821 就是要处理的进程 ID。

方法三:用 kill 终止进程

找到 PID 后,优先使用普通 kill

kill 3821

默认发送的是 SIGTERM,即信号 15。它会请求进程正常退出,让进程有机会:

执行后检查端口:

lsof -i :8080

如果进程仍然不退出,再使用:

kill -9 3821

kill -9 发送 SIGKILL,进程无法捕获或拒绝该信号,会被立即终止。但它没有清理机会,因此不应作为首选。

方法四:用 fuser 直接按端口杀进程

fuser 可以跳过手动查 PID 的步骤,直接按端口处理:

sudo fuser -k 8080/tcp

含义:

如果需要强制杀掉:

sudo fuser -k -9 8080/tcp

fuser 属于 psmisc 包,最小化系统可能需要安装:

sudo apt install psmisc
sudo dnf install psmisc

方法五:一行命令快速释放端口

文章给出了一条常见的一行命令:

sudo kill -9 $(sudo lsof -t -i :8080)

含义:

但这条命令适合临时处理,不适合生产环境直接复制使用。

风险点:

推荐操作顺序

更稳妥的处理顺序是:

sudo lsof -i :8080
kill <PID>
sudo lsof -i :8080

如果端口仍被占用,再执行:

kill -9 <PID>

如果偏向使用 ss

sudo ss -tulnp | grep :8080
kill <PID>

本地练习方法

可以启动一个简单 HTTP 服务占用 8080:

python3 -m http.server 8080

然后在另一个终端中查找并终止:

sudo lsof -i :8080
kill <PID>

多练几次,就能熟悉“查端口 → 找 PID → 优雅终止 → 验证释放”的流程。

生产环境注意事项

在生产环境释放端口前,建议额外确认:

示例:

sudo systemctl stop nginx

有服务管理器时,优先使用服务管理器;直接 kill 适合临时排障或本地开发。

结论

这篇文章的核心不是教你“如何最快杀进程”,而是提醒:释放端口前先识别进程,优先优雅退出,最后才强制终止。

最实用的默认命令组合是:

sudo lsof -i :8080
kill <PID>
sudo lsof -i :8080

在确认可以强制终止时,再用:

kill -9 <PID>