linux下查看各个进程占用的端口和对应的应用名称

在Linux系统中,查看进程占用的端口及其对应的应用名称有以下几种常用方法:

1. 使用 ss命令(推荐,现代系统)

bash 复制代码
# 查看所有TCP端口和进程名
ss -tlnp

# 查看所有TCP/UDP端口和进程名
ss -tunlp

# 格式化输出,更易读
ss -tlnp | awk 'BEGIN {printf "%-20s %-10s %-20s %-15s\n", "应用名称", "PID", "协议", "端口"} 
NR>1 {split($7, a, ","); gsub(/pid=|,.*/, "", a[2]); printf "%-20s %-10s %-20s %-15s\n", a[1], a[2], "TCP", $4}'

# 只显示应用名、PID、端口
ss -tunlp | grep -Eo '[0-9]+\".*\"' | sed 's/pid=//g' | sed 's/,.*\"//g'

2. 使用 netstat命令

bash 复制代码
# 查看所有端口和进程名
netstat -tunlp

# 美化输出格式
netstat -tunlp | awk 'NR<2{print $0;next} {print $1, $4, $6, $7}' | column -t

# 按端口排序
netstat -tunlp | sort -n -k 4

3. 使用 lsof命令(功能最全)

bash 复制代码
# 查看所有TCP端口和进程
lsof -iTCP -sTCP:LISTEN -P -n

# 查看所有端口和进程
lsof -i -P -n | grep LISTEN

# 格式化输出
lsof -i -P -n | grep LISTEN | awk '{printf "%-20s %-10s %-15s %-20s\n", $1, $2, $8, $9}'

# 查看指定应用的端口
lsof -i -P -n | grep LISTEN | grep 应用名

4. 使用 fuser命令

bash 复制代码
# 查看指定端口的进程
fuser 80/tcp
fuser 3306/tcp

# 显示详细信息
fuser -v 端口号/tcp

5. 自定义脚本(整合信息)

bash 复制代码
#!/bin/bash
# 保存为 show_ports.sh

echo "================================================================"
echo "端口占用情况(应用名称 | PID | 协议 | 端口 | 状态)"
echo "================================================================"

# 使用ss命令收集信息
ss -tunlp | while read line; do
    if echo "$line" | grep -q "LISTEN"; then
        # 提取信息
        proto=$(echo $line | awk '{print $1}')
        local_addr=$(echo $line | awk '{print $4}')
        process_info=$(echo $line | awk '{print $6}')
        
        # 提取端口
        port=$(echo $local_addr | awk -F: '{print $NF}')
        
        # 提取进程名和PID
        if [[ $process_info =~ \"(.*)\",pid=([0-9]+) ]]; then
            proc_name=${BASH_REMATCH[1]}
            pid=${BASH_REMATCH[2]}
            
            printf "%-20s %-8s %-8s %-10s %-10s\n" \
                "$proc_name" "$pid" "$proto" "$port" "LISTEN"
        fi
    fi
done

6. 一键查看脚本

bash 复制代码
#!/bin/bash
# 保存为 port_check.sh

echo "================= 系统端口占用详情 ================="
echo ""

# 检查命令是否存在
command -v ss >/dev/null 2>&1 && use_cmd="ss" || use_cmd="netstat"

if [ "$use_cmd" = "ss" ]; then
    echo "使用 ss 命令查看:"
    echo "----------------------------------------------------------------"
    echo "应用名称             PID       协议        本地地址:端口"
    echo "----------------------------------------------------------------"
    ss -tlnp | tail -n +2 | while read proto state recvq sendq localaddr peeraddr process; do
        if [[ $process =~ \"(.*)\",pid=([0-9]+) ]]; then
            printf "%-20s %-10s %-10s %-20s\n" \
                "${BASH_REMATCH[1]}" \
                "${BASH_REMATCH[2]}" \
                "$proto" \
                "$localaddr"
        fi
    done
else
    echo "使用 netstat 命令查看:"
    echo "----------------------------------------------------------------"
    netstat -tunlp | grep LISTEN | while read proto recvq sendq localaddr foreignaddr state pid_program; do
        pid=$(echo $pid_program | sed 's/\/.*//')
        program=$(echo $pid_program | sed 's/.*\///')
        printf "%-20s %-10s %-10s %-20s\n" "$program" "$pid" "$proto" "$localaddr"
    done
fi

echo ""
echo "================= 常见服务端口 ================="
echo "端口    服务/应用"
echo "----------------------------------------"
echo "22      SSH"
echo "80      HTTP (Web服务)"
echo "443     HTTPS"
echo "3306    MySQL数据库"
echo "5432    PostgreSQL数据库"
echo "6379    Redis"
echo "8080    HTTP代理/备用Web"
echo "9000    PHP-FPM"

7. 按应用名称过滤

bash 复制代码
# 查看Nginx相关端口
ss -tlnp | grep nginx
# 或
lsof -i -P -n | grep nginx

# 查看MySQL相关端口
ss -tlnp | grep mysql
# 或
lsof -i:3306

# 查看Docker相关端口
ss -tlnp | grep docker

8. 使用 systemctl查看服务端口

bash 复制代码
# 查看系统服务的端口
systemctl list-sockets --all

# 查看具体服务的端口
systemctl status 服务名 | grep -i listen

实用技巧

创建别名(添加到 ~/.bashrc)

bash 复制代码
# 查看端口占用的别名
alias showports="ss -tlnp | awk 'NR==1{print}; NR>1{split(\$6,a,\",\"); print a[1]\" \"\$4}' | column -t"
alias portcheck="echo '应用名称 PID 协议 端口'; ss -tlnp | tail -n +2 | awk '{match(\$6,/\"([^\"]+)\",pid=([0-9]+)/,m); if(m[1]!=\"\") print m[1], m[2], \$1, \$4}' | column -t"

实时监控端口变化

bash 复制代码
# 每2秒刷新一次
watch -n 2 'ss -tlnp'

输出示例

bash 复制代码
应用名称             PID        协议        本地地址:端口
nginx               1234        tcp        0.0.0.0:80
mysql               5678        tcp        127.0.0.1:3306
ssh                 9012        tcp        0.0.0.0:22
docker-proxy       3456        tcp        127.0.0.1:8080

推荐使用

  • 简单查看ss -tlnp

  • 详细查看lsof -i -P -n | grep LISTEN

  • 脚本工具 :上面的 port_check.sh

  • 调试排查:结合使用多种命令确保信息准确

相关推荐
全栈工程师修炼指南6 小时前
Nginx | stream content 阶段:UDP 协议四层反向代理浅析与实践
运维·网络·网络协议·nginx·udp
Lsir10110_6 小时前
【Linux】进程信号(上半)
linux·运维·服务器
开开心心就好7 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
火车叼位7 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
css趣多多7 小时前
add组件增删改的表单处理
java·服务器·前端
予枫的编程笔记7 小时前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun7 小时前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__8 小时前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
野犬寒鸦8 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
陈桴浮海8 小时前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible