进程 & 端口排查速查手册

#ps #ss #netstat #linux #运维

建议优先用 ss (更快、更现代),netstat 主要用于老系统兼容。

总览:什么时候用谁

  • ps:按"进程"为中心看信息(谁在跑、占用多少 CPU/内存、父子关系、线程...)。
  • ss :按"连接/端口"为中心看信息(谁在监听、连接状态、哪个进程占某端口)。推荐
  • netstat:老牌网络查看工具(net-tools 包)。很多新系统默认没装、功能被 ss / iproute2 替代。

ps:进程查看与筛选

常用姿势

bash 复制代码
# 全量进程(标准两种写法)
ps -ef
ps aux

# 只看指定列 + 排序(CPU/内存热度排查常用)
ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head
ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%mem | head

# 进程树(看父子关系/谁拉起了谁)
ps -eo pid,ppid,cmd --forest | less

# 查看某个进程的详细信息
ps -p <PID> -o pid,ppid,user,lstart,etime,%cpu,%mem,cmd

# 看线程(TID/CPU 绑定核等)
ps -Lp <PID> -o pid,tid,psr,stat,%cpu,comm

典型筛选

bash 复制代码
# 按名字找
ps -ef | grep '[n]ginx'
ps aux | grep '[j]ava'

# 查找最近启动的前 N 个进程(按启动时间逆序)
ps -eo pid,lstart,cmd --sort=lstart | tail -n 20

小贴士:

  • grep '[n]ginx' 写法可避免把 grep 自己匹配进去。
  • 结合 /proc/<PID> 能拿到更多:readlink -f /proc/<PID>/exe 看真正可执行文件路径;tr '\0' ' ' </proc/<PID>/cmdline 看完整启动参数。

ss:现代网络端口/连接工具(首选)

常用参数速记

  • -t TCP,-u UDP
  • -l 仅监听(Listening)
  • -a 所有(含非监听的已建立连接)
  • -n 不做域名/端口反解(更快、直出数字)
  • -p 显示进程(需 root)
  • -4 / -6 仅 IPv4 / IPv6
  • -s 汇总统计(状态总览)
  • state 过滤连接状态(listening/established/time-wait/close-wait...

一眼看服务在不在监听

bash 复制代码
# 所有监听中的 TCP/UDP 端口 + 进程
sudo ss -tulnp

# 只看 TCP 监听
sudo ss -ltnp

# 找指定端口(如 8080)
sudo ss -ltnp | grep ':8080 '

连接态分析

bash 复制代码
# 只看已建立的 TCP 连接
ss -tan state established

# 统计汇总(各状态数量、TCP/UDP 概览)
ss -s

通过端口找进程

bash 复制代码
# 谁占了 80 端口?
sudo ss -ltnp | grep ':80 '
# 输出会含 pid=1234,fd=...,拿到 PID 后:
ps -p 1234 -o pid,ppid,user,%cpu,%mem,cmd

只看某进程相关的连接

bash 复制代码
# 方法1:粗筛(按进程名)
sudo ss -tanp | grep nginx

# 方法2:按 PID 精确点
sudo ss -tanp | grep 'pid=1234,'

高级过滤(可选):
ss -tan '( sport = :22 or dport = :22 )'ss -tan state close-wait

某些 shell 里括号需要引号包起来;-p 需要 root 才能看到进程名。
注意:ss -K(尝试杀连接)在部分系统可用、且需 CAP_NET_ADMIN,一般不建议生产直接用。


netstat:经典工具(老系统/习惯党)

多数现代发行版默认不带,需要安装 net-tools。优点是大家都熟;缺点是速度慢、部分功能被替代。

常用

bash 复制代码
# 监听端口 + 进程
sudo netstat -tulpen

# 全部 TCP 连接(含非监听)
sudo netstat -plant

# 统计
netstat -s

# 路由/网卡(现代替代命令见下)
netstat -rn     # => 推荐用:ip route
netstat -i      # => 推荐用:ip -s link

场景化解决方案

1)"端口被占用,我要知道是谁"

bash 复制代码
sudo ss -ltnp | grep ':8021 '
# 或(老法):
sudo netstat -tulpen | grep ':8021 '
# 拿到 PID 后
ps -p <PID> -o pid,ppid,user,etime,%cpu,%mem,cmd
readlink -f /proc/<PID>/exe

2)"我想从进程反查它开了哪些端口"

bash 复制代码
# 先拿 PID(例:nginx)
pidof nginx
# 再在 ss 里按 pid 过滤
sudo ss -tulnp | grep "pid=$(pidof nginx | awk '{print $1}')"

3)"连接很多,机器卡,我要快速概览"

bash 复制代码
ss -s                               # 汇总态
ss -tan state established | wc -l   # 已建立连接数
ss -tan state time-wait   | wc -l   # TIME_WAIT 数
ss -tan state close-wait  | wc -l   # CLOSE_WAIT(应用未及时 close)

4)"内网只监听 127.0.0.1/::1,服务外面连不上"

  • Local Address 若是 127.0.0.1:PORT / ::1:PORT,说明只绑定本地环回。

  • 修改服务配置改为 0.0.0.0/:: 或对应对外网卡地址,再重启服务。

  • 再用 ss -ltnp 确认 0.0.0.0:PORT/[::]:PORT

5)"看不到进程名/端口名全是英文名"

  • -nss -ltnp,避免反解域名/服务名。

  • sudo 才能看到 -p 的进程信息(否则显示 users:(("?",pid=...)) 或直接缺失)。

6)容器环境的小坑

  • 新版 Docker/Podman 常直接由 容器内进程 监听宿主端口(NAT/iptables 转发);老版本 Docker 可能出现 docker-proxy

  • Podman/CRI-O 旁边你可能会看到 conmon 之类进程,但占端口的通常仍是容器内服务本体。

  • 看到 :::PORT 代表 IPv6 任意地址;很多工具会把 :::PORT 同时映射到 IPv4,注意防火墙策略一致性。


netstat ↔ ss 快速对照(常用)

目的 netstat ss(推荐)
监听端口 + 进程 sudo netstat -tulpen sudo ss -tulnp
所有 TCP 连接(含已建立) sudo netstat -plant sudo ss -tanp
只看监听中的 TCP sudo netstat -ltnp sudo ss -ltnp
统计汇总 netstat -s ss -s
路由表 netstat -rn ip route(替代)
网卡统计 netstat -i ip -s link(替代)

小结与建议

  1. 优先用 ssss -tulnp(监听端口)+ ss -tan state established(连接态)+ ss -s(总览)三板斧。
  2. 进程细节交给 psps -eo ... --sort 排热度、--forest 看树、-Lp 看线程。
  3. 需要进程名就加 sudo ;看不懂名字就加 -n
  4. 容器/防火墙/IPv6 三件套最常见坑:确认绑定地址、确认宿主/容器网络模式、确认策略一致。

具体使用

ps

  1. ps -ef SysV 风格全量列表
sh 复制代码
root@xiaocai:/app/prometheus# ps -ef                      # SysV 风格全量列表
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 10:19 ?        00:00:06 /sbin/init splash
root           2       0  0 10:19 ?        00:00:00 [kthreadd]
root           3       2  0 10:19 ?        00:00:00 [pool_workqueue_release]
root           4       2  0 10:19 ?        00:00:00 [kworker/R-rcu_gp]
root           5       2  0 10:19 ?        00:00:00 [kworker/R-sync_wq]
root           6       2  0 10:19 ?        00:00:00 [kworker/R-kvfree_rcu_reclaim]
root           7       2  0 10:19 ?        00:00:00 [kworker/R-slub_flushwq]
root           8       2  0 10:19 ?        00:00:00 [kworker/R-netns]
root          11       2  0 10:19 ?        00:00:00 [kworker/0:0H-events_highpri]
root          12       2  0 10:19 ?        00:00:00 [kworker/u512:0-ipv6_addrconf]
root          13       2  0 10:19 ?        00:00:00 [kworker/R-mm_percpu_wq]
root          14       2  0 10:19 ?        00:00:00 [rcu_tasks_kthread]
root          15       2  0 10:19 ?        00:00:00 [rcu_tasks_rude_kthread]
root          16       2  0 10:19 ?        00:00:00 [rcu_tasks_trace_kthread]
root          17       2  0 10:19 ?        00:00:00 [ksoftirqd/0]
root          18       2  0 10:19 ?        00:00:05 [rcu_preempt]
  1. ps aux BSD 风格全量列表
sh 复制代码
root@xiaocai:/app/prometheus# ps aux                      # BSD 风格全量列表
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1  23372 14384 ?        Ss   10:19   0:06 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    10:19   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    10:19   0:00 [pool_workqueue_release]
root           4  0.0  0.0      0     0 ?        I<   10:19   0:00 [kworker/R-rcu_gp]
root           5  0.0  0.0      0     0 ?        I<   10:19   0:00 [kworker/R-sync_wq]
root           6  0.0  0.0      0     0 ?        I<   10:19   0:00 [kworker/R-kvfree_rcu_reclaim]
root           7  0.0  0.0      0     0 ?        I<   10:19   0:00 [kworker/R-slub_flushwq]
  1. ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head
sh 复制代码
root@xiaocai:/app/prometheus# ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head
    PID    PPID USER     %CPU %MEM     ELAPSED CMD
   8357    6631 root      1.6  0.2    04:23:17 node_exporter
  20492       1 root      0.2  0.5       01:20 /usr/libexec/fwupd/fwupd
   2429    2099 xiaocai   0.2  3.4    04:42:06 /usr/bin/gnome-shell
   3216    1403 root      0.1  0.4    04:42:01 containerd --config /var/run/docker/containerd/containerd.toml
    838       1 avahi     0.1  0.0    04:42:20 avahi-daemon: running [xiaocai-2.local]
  20270       2 root      0.0  0.0       40:27 [kworker/0:1-events]
   1403       1 root      0.0  0.8    04:42:18 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    862       1 root      0.0  0.5    04:42:20 /usr/lib/snapd/snapd
  20331       2 root      0.0  0.0       18:33 [kworker/3:2-events]
  1. ps -eo pid,ppid,cmd --forest | less
sh 复制代码
root@xiaocai:/app/prometheus# ps -eo pid,ppid,cmd --forest | less     # 进程树(父子关系)
    PID    PPID CMD
      2       0 [kthreadd]
      3       2  \_ [pool_workqueue_release]
      4       2  \_ [kworker/R-rcu_gp]
      5       2  \_ [kworker/R-sync_wq]
      6       2  \_ [kworker/R-kvfree_rcu_reclaim]
      7       2  \_ [kworker/R-slub_flushwq]
      8       2  \_ [kworker/R-netns]
     11       2  \_ [kworker/0:0H-events_highpri]
     12       2  \_ [kworker/u512:0-ipv6_addrconf]
     13       2  \_ [kworker/R-mm_percpu_wq]
     14       2  \_ [rcu_tasks_kthread]
     15       2  \_ [rcu_tasks_rude_kthread]
  1. ps -p 8357 -o pid,ppid,user,lstart,etime,%cpu,%mem,cmd
sh 复制代码
root@xiaocai:/app/prometheus# ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head
    PID    PPID USER     %CPU %MEM     ELAPSED CMD
   8357    6631 root      1.6  0.2    04:23:17 node_exporter
  20492       1 root      0.2  0.5       01:20 /usr/libexec/fwupd/fwupd
   2429    2099 xiaocai   0.2  3.4    04:42:06 /usr/bin/gnome-shell
   3216    1403 root      0.1  0.4    04:42:01 containerd --config /var/run/docker/containerd/containerd.toml
    838       1 avahi     0.1  0.0    04:42:20 avahi-daemon: running [xiaocai-2.local]
  20270       2 root      0.0  0.0       40:27 [kworker/0:1-events]
   1403       1 root      0.0  0.8    04:42:18 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    862       1 root      0.0  0.5    04:42:20 /usr/lib/snapd/snapd
  20331       2 root      0.0  0.0       18:33 [kworker/3:2-events]
root@xiaocai:/app/prometheus# ps -eo pid,ppid,cmd --forest | less     # 进程树(父子关系)
root@xiaocai:/app/prometheus# 
root@xiaocai:/app/prometheus# ps -p 8357 -o pid,ppid,user,lstart,etime,%cpu,%mem,cmd
    PID    PPID USER                      STARTED     ELAPSED %CPU %MEM CMD
   8357    6631 root     三 8月 27 10:38:41 2025   04:25:21  1.6  0.2 node_exporter

字段速懂

  • PID/PPID:进程/父进程 ID
  • %CPU/%MEM:瞬时占用比例(取样窗口,非累计)
  • STAT :进程状态(R 运行、S 休眠、D 不可中断、Z 僵尸、T 停止;带 + 表示前台)
  • ETIME/LSTART:运行时长 / 启动时间
  • CMD:完整启动命令

进阶技巧

  • 避免把 grep 自己匹配进去:ps -ef | grep '[n]ginx'
  • 查真实可执行文件与启动参数:
    readlink -f /proc/<PID>/exe tr '\0' ' ' < /proc/<PID>/cmdline
  • 快速找"最近启动"的服务:ps -eo pid,lstart,cmd --sort=lstart | tail -n 20

ss

基本参数

  • 协议:-t TCP,-u UDP
  • 过滤:-l 仅监听,-a 全部,state 指定状态
  • 解析:-n 不反解(快),-p 进程(需 root),-4/-6 IPv4/IPv6
  • 总览:-s 统计摘要

常用组合

  1. ss -tulnp 所有监听端口 + 进程
sh 复制代码
root@xiaocai:/app/prometheus# ss -tulnp
Netid            State             Recv-Q            Send-Q                       Local Address:Port                        Peer Address:Port            Process                                                             
udp              UNCONN            0                 0                               127.0.0.54:53                               0.0.0.0:*                users:(("systemd-resolve",pid=634,fd=16))                          
udp              UNCONN            0                 0                            127.0.0.53%lo:53                               0.0.0.0:*                users:(("systemd-resolve",pid=634,fd=14))                          
udp              UNCONN            0                 0                                  0.0.0.0:5353                             0.0.0.0:*                users:(("avahi-daemon",pid=838,fd=12))                             
udp              UNCONN            0                 0                                  0.0.0.0:50695                            0.0.0.0:*                users:(("avahi-daemon",pid=838,fd=14))                             
udp              UNCONN            0                 0                                     [::]:5353                                [::]:*                users:(("avahi-daemon",pid=838,fd=13))                             
udp              UNCONN            0                 0                                     [::]:43997                               [::]:*                users:(("avahi-daemon",pid=838,fd=15))                             
tcp              LISTEN            0                 4096                             127.0.0.1:631                              0.0.0.0:*                users:(("cupsd",pid=1253,fd=7))                                    
tcp              LISTEN            0                 128                              127.0.0.1:6010                             0.0.0.0:*                users:(("sshd",pid=6454,fd=7))                                     
tcp              LISTEN            0                 128                              127.0.0.1:6011                             0.0.0.0:*                users:(("sshd",pid=8367,fd=7))                                     
tcp              LISTEN            0                 4096                         127.0.0.53%lo:53                               0.0.0.0:*                users:(("systemd-resolve",pid=634,fd=15))                          
tcp              LISTEN            0                 4096                            127.0.0.54:53                               0.0.0.0:*                users:(("systemd-resolve",pid=634,fd=17))                          
tcp              LISTEN            0                 4096                                 [::1]:631                                 [::]:*                users:(("cupsd",pid=1253,fd=6))                                    
tcp              LISTEN            0                 128                                  [::1]:6011                                [::]:*                users:(("sshd",pid=8367,fd=5))                                     
tcp              LISTEN            0                 128                                  [::1]:6010                                [::]:*                users:(("sshd",pid=6454,fd=5))                                     
tcp              LISTEN            0                 4096                                     *:22                                     *:*                users:(("sshd",pid=1268,fd=3),("systemd",pid=1,fd=425))            
tcp              LISTEN            0                 4096                                     *:9100                                   *:*                users:(("node_exporter",pid=8357,fd=3))                            
tcp              LISTEN            0                 4096                                     *:2375                                   *:*                users:(("dockerd",pid=1403,fd=3)) 
  1. sudo ss -ltnp | grep ':9100 ' 指定端口监听者
sh 复制代码
# ss -ltnp | grep ':9100 '
LISTEN 0      4096               *:9100            *:*    users:(("node_exporter",pid=8357,fd=3))
  1. ss -tan state established 已建立 TCP 连接
sh 复制代码
root@xiaocai:/app/prometheus# ss -tan state established
Recv-Q                      Send-Q                                                  Local Address:Port                                                   Peer Address:Port                      Process                      
0                           0                                                [::ffff:172.16.0.74]:22                                             [::ffff:172.16.0.60]:4269                                                   
0                           0                                                [::ffff:172.16.0.74]:22                                             [::ffff:172.16.0.60]:8504                                                   
0                           0                                                [::ffff:172.16.0.74]:9100                                           [::ffff:172.16.0.66]:55566                                                  
0                           0                                                [::ffff:172.16.0.74]:22                                             [::ffff:172.16.0.60]:8637                                                   
0                           52                                               [::ffff:172.16.0.74]:22                                             [::ffff:172.16.0.60]:3325 
  1. ss -s 总览:各状态计数、TCP 内核参数摘要

    root@xiaocai:/app/prometheus# ss -s
    Total: 824
    TCP: 16 (estab 5, closed 0, orphaned 0, timewait 0)

    Transport Total IP IPv6
    RAW 0 0 0
    UDP 7 5 2
    TCP 16 5 11
    INET 23 10 13
    FRAG 0 0 0

netstat

常用

sudo netstat -tulpen # 监听端口 + 进程 + 用户 sudo netstat -plant # 所有 TCP 连接(含非监听) netstat -s # 协议统计 netstat -rn # 路由表(现代替代:ip route) netstat -i # 网卡统计(替代:ip -s link)

与 ss 的一一对应

目的 netstat ss(推荐)
监听端口+进程 sudo netstat -tulpen sudo ss -tulnp
所有 TCP 连接 sudo netstat -plant sudo ss -tanp
仅监听 TCP sudo netstat -ltnp sudo ss -ltnp
统计汇总 netstat -s ss -s
相关推荐
竹君子2 小时前
研发管理知识库(1)DevOps开发模式简介
运维·devops
java_logo7 小时前
HashiCorp Vault 镜像拉取与 Docker 部署全指南
运维·docker·容器
Maple_land9 小时前
Linux复习:冯·诺依曼体系下的计算机本质:存储分级与IO效率的底层逻辑
linux·运维·服务器·c++·centos
linmengmeng_131411 小时前
【Jenkins】Jenkins配置从节点 - Launch Agent
运维·servlet·jenkins
人工智能训练11 小时前
如何在 Ubuntu 22.04 中安装 Docker 引擎和 Linux 版 Docker Desktop 桌面软件
linux·运维·服务器·数据库·ubuntu·docker·ai编程
Maple_land12 小时前
Linux复习:系统调用与fork
linux·运维·服务器·c++·centos
996终结者12 小时前
Docker核心用途实战:彻底解决环境一致性问题
运维·docker·容器
小晶晶京京13 小时前
day61-devops
运维·devops