进程 & 端口排查速查手册

#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
相关推荐
2301_7809438423 分钟前
linux 对文件打补丁(Patch)
linux·运维·服务器
ICT董老师28 分钟前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
敬往事一杯酒哈33 分钟前
Ubuntu 20.04 安装Anacada
linux·运维·ubuntu
还在忙碌的吴小二34 分钟前
Jenkins CLI (jcli) 使用手册
运维·jenkins
ChangYan.36 分钟前
Windows命令行(cmd)下快速查找文件路径(类似Linux下find命令)
linux·运维·服务器
陈让然1 小时前
VS Code新版本无法连接WSL ubuntu18.04
linux·运维·ubuntu
lpfasd1231 小时前
宝塔面板使用流程及注意事项
运维
小杰帅气1 小时前
神秘的环境变量和进程地址空间
linux·运维·服务器
胖咕噜的稞达鸭1 小时前
进程间的通信(1)(理解管道特性,匿名命名管道,进程池,systeam V共享内存是什么及优势)重点理解代码!
linux·运维·服务器·数据库