Linux 端口号占用如何处理
创始人
2025-05-29 20:32:54

在Linux中,可以使用以下命令来查看端口号的占用情况:

sudo netstat -tlnp

该命令会列出当前所有正在使用的端口号以及占用该端口号的进程的信息。

如果需要释放某个端口号,可以使用以下命令:

sudo kill <进程ID>

其中,进程ID是占用该端口号的进程的唯一标识符。可以通过上述 netstat 命令来查看进程ID。

如果进程ID不知道,也可以使用以下命令来释放该端口号:

sudo fuser -k <端口号>/tcp

这个命令会终止占用该端口号的进程。

需要注意的是,如果占用端口号的进程是系统关键进程或正在运行的重要程序,不要轻易终止它。另外,在使用 kill 或 fuser 命令时,一定要小心,确保不会意外终止其他进程。

netstat -tlnp 命令用于列出系统上所有正在使用的TCP和UDP端口,并显示每个端口对应的进程信息。

命令输出的各个字段的含义如下:

  • Proto:显示协议类型,TCP或UDP。
  • Recv-Q:显示接收队列中等待应用程序处理的数据包数量。
  • Send-Q:显示发送队列中等待传输的数据包数量。
  • Local Address:显示本地地址和端口号。
  • Foreign Address:显示远程地址和端口号。
  • State:显示连接状态,如ESTABLISHED,LISTENING,TIME_WAIT等。
  • PID/Program name:显示占用该端口的进程的PID和进程名。

例如,tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd 表示SSH服务占用了本机的22端口,当前处于监听状态(LISTEN),对所有IP地址都开放(0.0.0.0),对外的远程地址尚未建立连接(Foreign Address为"*"),该端口号对应的进程PID为1234,进程名为sshd。

总之,netstat -tlnp 可以让我们了解系统上各个端口的使用情况和占用该端口的进程信息,方便我们排查端口冲突和网络问题。

当 netstat -tlnp 命令输出中的 Foreign Address 字段显示为 ::: * 时,表示对外的远程地址尚未建立连接,且该端口对所有IPv6地址和IPv4地址都开放,等价于 0.0.0.0:*。在IPv6环境下,::: 表示所有IPv6地址,而 0.0.0.0 表示所有IPv4地址。

例如,tcp6 0 0 :::22 ::: * LISTEN 1234/sshd 表示SSH服务占用了本机的22端口,对所有IP地址都开放,当前处于监听状态(LISTEN),且远程地址尚未建立连接。

通常情况下,::: * 或 0.0.0.0:* 表示该端口对所有网络接口都开放,可以被外部访问,这在服务器应用程序中非常常见。但对于一些安全性要求较高的场景,需要限制端口只对特定的IP地址开放,可以通过防火墙等方式进行配置。

当程序崩溃并且没有正常释放端口时,下一次启动程序可能会出现端口被占用的情况。这时可以尝试以下几种方法:

  1. 查看并关闭占用该端口的进程:可以使用 netstat -tlnp 命令查看占用该端口的进程,找到该进程的PID,然后使用 kill 命令关闭该进程。例如,kill -9 命令可以强制关闭该进程。如果占用该端口的进程不是本应用程序,则需要确定是否可以关闭该进程。

  2. 修改程序监听端口:可以修改程序代码,将监听的端口修改为其他可用的端口,然后重新启动程序。

  3. 等待一段时间:可以等待一段时间后再尝试启动程序,可能是因为系统没有及时释放端口,等待一段时间后端口就被释放了。

  4. 使用SO_REUSEPORT选项:可以在程序中使用 setsockopt 函数设置 SO_REUSEPORT 选项,允许多个进程在同一端口上进行监听,避免了因为进程崩溃导致端口无法被重新使用的情况。使用该选项需要确保程序的逻辑正确,否则可能会导致数据混乱等问题。

  5. 重启系统:如果以上方法都无法解决问题,可以尝试重启系统,重新释放端口。但是这种方法会中断正在运行的其他应用程序,需要谨慎使用。

总之,在处理端口被占用的情况时,需要考虑多种因素,根据实际情况选择合适的方法进行处理。

通过程序代码调用系统的API函数来获取占用该端口的进程ID,并且杀掉该进程。具体实现方法如下,
使用了 Linux 下的系统调用和命令行工具 lsof:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include // 获取指定端口占用的进程 ID
std::string get_pid_using_port(int port) {std::stringstream cmd;cmd << "lsof -t -i :" << port;FILE* fp = popen(cmd.str().c_str(), "r");if (!fp) {throw std::runtime_error("popen failed");}char buf[16] = {0};if (fgets(buf, sizeof(buf), fp) == NULL) {pclose(fp);return "";}pclose(fp);return std::string(buf);
}// 关闭指定的进程
void kill_process(const std::string& pid) {std::string cmd = "kill -9 " + pid;system(cmd.c_str());
}int main() {int port = 9090;int listen_fd = socket(AF_INET, SOCK_STREAM, 0);if (listen_fd < 0) {perror("socket");return -1;}// 绑定地址struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY;serv_addr.sin_port = htons(port);if (bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {std::string pid = get_pid_using_port(port);if (!pid.empty()) {kill_process(pid);}// 重新绑定if (bind(listen_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {perror("bind");return -1;}}// 监听if (listen(listen_fd, 5) < 0) {perror("listen");return -1;}std::cout << "listening on port " << port << std::endl;// 接受连接等操作// ...return 0;
}

该代码中,首先通过 lsof 命令获取占用指定端口的进程 ID,然后使用 kill 命令杀掉该进程。最后再次尝试绑定端口并监听连接。如果仍然无法绑定端口,则程序会输出错误信息并退出。

相关内容

热门资讯

什么是BI ?企业数字化的规划... BI技术是使现代企业能够利用数据做出合理,基于事实和可行的决策以改善其运营和利润率的工...
手机上怎么查移动详单,如何查中... 1. 下载并打开中国移动APP。 3. 点击底部导航栏的“分类”。 4. 在“分类”页面...
最近有什么好看的电影吗,最近有... 最近有什么好看的电影吗目录最近有什么好看的电影吗最近有什么好看的电影啊(推荐几部必看的影片)最近有哪...
iphone8p尺寸多大,苹果... iphone8p尺寸多大目录iphone8p尺寸多大苹果8pIus屏幕长宽多少厘米?不是机身尺寸!是...
半夜影院开吗,电影院晚上几点关... 半夜影院开吗目录半夜影院开吗电影院晚上几点关门?凌晨两点多还能进电影院吗西宁凌晨能开的电影院有哪些半...
Python科研绘图——介绍 “在做科研的路上,避免不了制作结果图,像常见的作图软件如Prism&#x...
MySQL查看正在运行的SQL MySQL查看正在运行的SQL 前言 ​ 在安装MySQL的时候会默认初始化几个MySQL运行所需的...
秒杀限制人群,如何设计秒杀服务... 对于秒杀业务,大家应该比较熟悉了。比如,“某商品原价 1299 元&#x...
张国荣是怎么走的,张国荣怎么死... 张国荣是怎么走的目录张国荣是怎么走的张国荣怎么死的 张国荣去世原因张国荣是怎么去世的张国荣是怎么死的...
跨年之夜的说说,关于跨年夜的心... 跨年之夜的说说目录跨年之夜的说说关于跨年夜的心情说说 一个人跨年的伤感说说(精选28句)2022年跨...
三连是什么梗,网络用语三连是什... 三连是什么梗目录三连是什么梗网络用语三连是什么意思?小红书评论三连是什么意思?三连是什么梗 三...
博迪学校怎么招生,西安博迪小学... 博迪学校怎么招生目录博迪学校怎么招生西安博迪小学入学条件是什么教育培训机构如何去招生?博迪学校怎么招...
100天精通Python(可视... 文章目录0. 专栏导读1. 普通折线图2. 网格折线图3. 趋势折线图4. 对比折线图5. 百分比折...
基础和高级的ACL的基础配置和... 基础和高级的ACL的基础配置和原理 需求 如图配置设备的IP地址售后服务部不允许访问财务部服务器&#...
linux入门---gdb的使... 目录标题gdb是什么如何使用gdb打开文件如何查看release和debug的不同正式调试l断点运行...
会计做账步骤是什么,财务做账要... 会计做账步骤是什么目录会计做账步骤是什么财务做账要怎么做账会计做账的步骤一般是怎么样的呢?会计手工做...
大学生可以贷款吗,大学生可以向... 大学生可以贷款吗目录大学生可以贷款吗大学生可以向银行贷款吗在校大学生能贷款么?大学生可以贷款吗 ...
社交新时代,元宇宙结合游戏应用... 人是社会动物,需要进行社交。社交的本质是人与人之间通过某种方式或工具传递信息ÿ...
超市买的腊肠可以直接吃吗,超市... 超市买的腊肠可以直接吃吗目录超市买的腊肠可以直接吃吗超市买来的腊肠直接可以吃吗?腊肠买回来就能吃吗?...
讣告什么意思,讣告 [fù g... 讣告什么意思目录讣告什么意思讣告 [fù gào]什么意思?近义词和反义词是什么?英文翻译是什么?讣...
【JVM】字节码指令全解 文章目录 入门案例原始 java 代码编译后的字节码文件常量池载入运行时常量池方法字节码载入方法区m...
电动自行车后轮轴承怎么拆,拆装... 电动自行车后轮轴承怎么拆目录电动自行车后轮轴承怎么拆拆装电动车后轮及轴承视频教程电动车后轮轴承怎么拆...
奇葩说六季冠军分别是谁,奇葩说... 奇葩说六季冠军分别是谁目录奇葩说六季冠军分别是谁奇葩说第一届冠军是谁?
移动有什么套餐流量多,中国移动... 移动有什么套餐流量多目录移动有什么套餐流量多中国移动流量套餐有哪些?移动有什么流量多的套餐吗?移动有...
蓝桥杯刷题冲刺 | 倒计时20... 作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝...
标婷维e乳可以擦脸吗,标婷维生... 标婷维e乳可以擦脸吗目录标婷维e乳可以擦脸吗标婷维生素e乳可以擦脸吗标婷维生素E乳可以白天擦脸用吗?...
基于 Vite + Vue3 ... 方式一:手动完整引入(不推荐) 只需要在 main.js ...
临床决策曲线DCA如何解决预测... 临床决策曲线可以说解决了临床预测模型到临床应用的一个痛点。以前存在这样一个现象,一个预...
Gradio-Learning Gradio-Learning 文章目录Gradio-LearningInterface函数-展示单...
计算机共有几个等级证书,计算机... 计算机共有几个等级证书目录计算机共有几个等级证书计算机等级考试证书等级说明计算机有几个证书?计算机等...