linux 根据端口查看进程和对应的应用

在 Linux 中,根据端口查看进程及对应应用的详细信息 (如应用路径、启动命令、配置文件等),核心流程是:先通过端口找到 PID → 再通过 PID 追溯应用详情。以下是分步实操方案,包含命令、示例和场景化技巧,适配运维 / DevOps 日常排查需求:

一、核心步骤:端口 → PID → 应用详情

第一步:通过端口查询对应的 PID(3 种常用方法)

优先使用 ss(高效)或 lsof(信息全),以下以查询 8080 端口 为例:

命令(需 root 权限) 作用 示例输出(关键信息标注)
`sudo ss -tulnp grep 8080` 快速查询监听端口的 PID 和进程名 LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=1234,fd=42)) → PID=1234,进程名 = java
sudo lsof -i:8080 查看端口关联的进程详情 COMMAND PID USER FD TYPE DEVICE NAME java 1234 root 42u IPv4 12345 TCP *:8080 (LISTEN) → PID=1234,用户 = root
`sudo netstat -tulnp grep 8080` 兼容旧系统(需安装 net-tools) tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1234/java → PID=1234,进程名 = java

注意:如果端口未监听(如处于 TIME_WAIT 状态),lsof 需加 -Pn 参数:sudo lsof -i:8080 -Pn

第二步:通过 PID 查询应用详细信息(4 种关键方法)

拿到 PID 后(如上述 1234),通过以下命令获取应用的路径、启动参数、配置文件 等核心信息,避免误判同名进程(如多个 java/python 进程)。

1. 查看应用启动命令及完整参数(最常用)
bash 复制代码
# 方法 1:ps -ef(显示用户、PID、父进程、启动命令)
sudo ps -ef | grep 1234

# 方法 2:ps auxww(显示完整命令行,无截断)
sudo ps auxww | grep 1234

示例输出(Java 应用)

bash 复制代码
root      1234  0.0  5.0 1000000 200000 ?      Sl   10:00  0:05 /usr/bin/java -jar /opt/tomcat/webapps/myapp.jar --spring.profiles.active=prod --server.port=8080

关键信息提取

  • 应用类型:Java 应用(通过 java -jar 判断)
  • 应用路径:/opt/tomcat/webapps/myapp.jar
  • 启动参数:--spring.profiles.active=prod(生产环境配置)
  • 端口配置:--server.port=8080(确认端口与查询一致)
2. 查看应用的安装 / 运行路径
bash 复制代码
# 方法 1:pwdx(直接显示进程的工作目录)
sudo pwdx 1234
# 输出:1234: /opt/tomcat(应用的工作目录)

# 方法 2:通过 /proc 文件系统(底层方式,最准确)
sudo ls -l /proc/1234/exe  # exe 是应用程序的符号链接
# 输出:lrwxrwxrwx 1 root root 0 10月  1 10:00 /proc/1234/exe -> /usr/bin/java(应用执行文件路径)

sudo cat /proc/1234/cwd  # cwd 是当前工作目录的路径
# 输出:/opt/tomcat(与 pwdx 结果一致)
3. 查看应用打开的文件 / 配置(排查配置文件位置)
bash 复制代码
# 列出进程打开的所有文件(包括配置文件、日志文件)
sudo lsof -p 1234 | grep -E "\.conf|\.properties|\.log"

示例输出

复制代码
java    1234 root  100r   REG    8,1  1024  12345 /opt/tomcat/conf/application-prod.properties(配置文件)
java    1234 root  101w   REG    8,1  4096  67890 /opt/tomcat/logs/myapp.log(日志文件)
4. 查看应用的网络连接(确认端口监听详情)
bash 复制代码
# 查看进程 1234 的所有网络连接(包括客户端连接、其他端口)
sudo ss -tulnp | grep 1234
# 或
sudo netstat -anp | grep 1234

二、场景化示例:实战排查端口占用问题

假设场景:启动 Nginx 时提示 80 端口被占用,需找到占用端口的应用并处理。

步骤 1:查询 80 端口对应的 PID
bash 复制代码
sudo lsof -i:80

输出:

复制代码
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   5678  root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)
httpd   5679  apache  6u  IPv4  12345      0t0  TCP *:http (LISTEN)

→ 发现 PID=5678/5679 的 httpd 进程占用 80 端口。

步骤 2:查询 httpd 应用的详情
bash 复制代码
# 查看启动命令
sudo ps auxww | grep 5678

输出:

复制代码
root      5678  0.0  2.0  80000 40000 ?      Ss   09:00  0:03 /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf

→ 应用是 Apache HTTP Server,配置文件路径 etc/httpd/conf/httpd.conf,工作目录 /var/www/html

步骤 3:处理端口冲突(可选)
bash 复制代码
# 停止 httpd 服务(如果不需要)
sudo systemctl stop httpd
# 或修改 Nginx 端口为 8080(避免冲突)
sudo sed -i 's/listen 80;/listen 8080;/g' /etc/nginx/nginx.conf
sudo systemctl restart nginx

三、常见问题排查

1. 端口被占用但查不到 PID?

原因:端口处于 TIME_WAIT 状态(连接断开后临时占用),而非 LISTEN 状态。

bash 复制代码
# 查看端口状态(含 TIME_WAIT)
sudo ss -tuln | grep 8080
# 输出示例(TIME_WAIT 状态,无 PID)
TIME-WAIT 0 0 192.168.1.100:8080 192.168.1.200:54321

解决:无需处理(系统会自动释放,默认超时 60 秒),或调整内核参数缩短超时时间:

bash 复制代码
sudo sysctl -w net.ipv4.tcp_fin_timeout=30  # 临时生效
echo "net.ipv4.tcp_fin_timeout=30" >> /etc/sysctl.conf  # 永久生效
sudo sysctl -p
2. 多个同名进程(如多个 java),如何区分?

通过启动参数和应用路径区分:

bash 复制代码
# 查看所有 java 进程的完整启动命令
sudo ps auxww | grep java

输出示例:

复制代码
root  1234  0.0  5.0 1000000 200000 ? Sl 10:00 0:05 /usr/bin/java -jar /opt/tomcat/myapp.jar  # 应用 A
root  5678  0.0  4.0 900000 180000 ? Sl 11:00 0:03 /usr/bin/java -jar /opt/jetty/otherapp.jar  # 应用 B
3. 非 root 用户查不到进程信息?

原因:-p 参数需要 root 权限才能获取 PID 和应用信息,切换 root 或加 sudo 即可。

四、一键脚本:快速查询端口→PID→应用详情

将以下脚本保存为 port2app.sh,直接执行 ./port2app.sh 端口号 即可输出完整信息:

bash 复制代码
#!/bin/bash
if [ $# -ne 1 ]; then
    echo "用法:$0 端口号"
    exit 1
fi
PORT=$1

echo "=== 端口 $PORT 对应的进程及应用信息 ==="
echo "1. 端口关联的 PID:"
sudo ss -tulnp | grep -w ":$PORT" || sudo lsof -i:$PORT | grep -w LISTEN

echo -e "\n2. 应用详细信息:"
PID=$(sudo ss -tulnp | grep -w ":$PORT" | awk -F 'pid=' '{print $2}' | awk -F ',' '{print $1}' 2>/dev/null)
if [ -z "$PID" ]; then
    PID=$(sudo lsof -i:$PORT | grep -w LISTEN | awk '{print $2}' 2>/dev/null)
fi
if [ -n "$PID" ]; then
    echo "PID: $PID"
    echo "启动命令:"
    sudo ps auxww | grep -w $PID | grep -v grep
    echo "工作目录:"
    sudo pwdx $PID 2>/dev/null
    echo "应用路径:"
    sudo ls -l /proc/$PID/exe 2>/dev/null
else
    echo "未找到监听端口 $PORT 的进程(可能处于 TIME_WAIT 状态)"
fi

使用方法:

bash 复制代码
chmod +x port2app.sh
sudo ./port2app.sh 8080

总结

核心逻辑:端口 → PID → 应用,关键命令组合:

  1. 查 PID:sudo ss -tulnp | grep 端口sudo lsof -i:端口
  2. 查应用:ps auxww | grep PID(启动命令)、pwdx PID(工作目录)、ls -l /proc/PID/exe(应用路径)

该流程适用于端口冲突排查、服务异常定位、进程审计等场景,完全适配 IT 运维 / DevOps 日常工作需求,可直接复制命令执行。

相关推荐
kali-Myon5 小时前
快速解决 Docker 环境中无法打开 gdb 调试窗口以及 tmux 中无法滚动页面内容和无法选中复制的问题
运维·安全·docker·容器·gdb·pwn·tmux
黑客思维者5 小时前
为什么Linux常被提权操作?
linux·网络·安全
石像鬼₧魂石5 小时前
Fail2Ban核心架构学习
linux·学习·ubuntu
阿阿越5 小时前
Linux系统编程 -- 进程优先级、切换和调度
linux·运维·服务器
Hey小孩5 小时前
Linux审计组件:auditd
linux·运维
wanhengidc5 小时前
云手机存在哪些技术瓶颈
运维·服务器·安全·智能手机·生活
水天需0105 小时前
Vim 标签页(Tab)操作详解
linux
管理大亨5 小时前
ELK + Redis Docker 企业级部署落地方案
大数据·运维·elk·elasticsearch·docker·jenkins
德迅云安全—珍珍6 小时前
物理服务器、云服务器、裸金属服务器的区别
运维·服务器