进程 端口排查速查手册
#ps #ss #netstat #linux #运维
建议优先用 ss(更快、更现代),netstat 主要用于老系统兼容。
总览:什么时候用谁
- ps:按“进程”为中心看信息(谁在跑、占用多少 CPU/内存、父子关系、线程…)。
- ss:按“连接/端口”为中心看信息(谁在监听、连接状态、哪个进程占某端口)。推荐
- netstat:老牌网络查看工具(net-tools 包)。很多新系统默认没装、功能被 ss / iproute2 替代。
ps:进程查看与筛选
常用姿势
# 全量进程(标准两种写法)
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
典型筛选
# 按名字找
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:现代网络端口/连接工具(首选)
常用参数速记
-tTCP,-uUDP-l仅监听(Listening)-a所有(含非监听的已建立连接)-n不做域名/端口反解(更快、直出数字)-p显示进程(需 root)-4 / -6仅 IPv4 / IPv6-s汇总统计(状态总览)state过滤连接状态(listening/established/time-wait/close-wait…)
一眼看服务在不在监听
# 所有监听中的 TCP/UDP 端口 + 进程
sudo ss -tulnp# 只看 TCP 监听
sudo ss -ltnp# 找指定端口(如 8080)
sudo ss -ltnp | grep ':8080 '
连接态分析
# 只看已建立的 TCP 连接
ss -tan state established# 统计汇总(各状态数量、TCP/UDP 概览)
ss -s
通过端口找进程
# 谁占了 80 端口?
sudo ss -ltnp | grep ':80 '
# 输出会含 pid=1234,fd=...,拿到 PID 后:
ps -p 1234 -o pid,ppid,user,%cpu,%mem,cmd
只看某进程相关的连接
# 方法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。优点是大家都熟;缺点是速度慢、部分功能被替代。
常用
# 监听端口 + 进程
sudo netstat -tulpen# 全部 TCP 连接(含非监听)
sudo netstat -plant# 统计
netstat -s# 路由/网卡(现代替代命令见下)
netstat -rn # => 推荐用:ip route
netstat -i # => 推荐用:ip -s link
场景化解决方案
1)“端口被占用,我要知道是谁”
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)“我想从进程反查它开了哪些端口”
# 先拿 PID(例:nginx)
pidof nginx
# 再在 ss 里按 pid 过滤
sudo ss -tulnp | grep "pid=$(pidof nginx | awk '{print $1}')"
3)“连接很多,机器卡,我要快速概览”
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)“看不到进程名/端口名全是英文名”
-
加
-n:ss -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(替代) |
小结与建议
- 优先用
ss:ss -tulnp(监听端口)+ss -tan state established(连接态)+ss -s(总览)三板斧。 - 进程细节交给 ps:
ps -eo ... --sort排热度、--forest看树、-Lp看线程。 - 需要进程名就加 sudo;看不懂名字就加
-n。 - 容器/防火墙/IPv6 三件套最常见坑:确认绑定地址、确认宿主/容器网络模式、确认策略一致。
具体使用
ps
- ps -ef SysV 风格全量列表
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]
- ps aux BSD 风格全量列表
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]
- ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head
root@xiaocai:/app/prometheus# ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | headPID PPID USER %CPU %MEM ELAPSED CMD8357 6631 root 1.6 0.2 04:23:17 node_exporter20492 1 root 0.2 0.5 01:20 /usr/libexec/fwupd/fwupd2429 2099 xiaocai 0.2 3.4 04:42:06 /usr/bin/gnome-shell3216 1403 root 0.1 0.4 04:42:01 containerd --config /var/run/docker/containerd/containerd.toml838 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.sock862 1 root 0.0 0.5 04:42:20 /usr/lib/snapd/snapd20331 2 root 0.0 0.0 18:33 [kworker/3:2-events]
- ps -eo pid,ppid,cmd --forest | less
root@xiaocai:/app/prometheus# ps -eo pid,ppid,cmd --forest | less # 进程树(父子关系)PID PPID CMD2 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]
- ps -p 8357 -o pid,ppid,user,lstart,etime,%cpu,%mem,cmd
root@xiaocai:/app/prometheus# ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | headPID PPID USER %CPU %MEM ELAPSED CMD8357 6631 root 1.6 0.2 04:23:17 node_exporter20492 1 root 0.2 0.5 01:20 /usr/libexec/fwupd/fwupd2429 2099 xiaocai 0.2 3.4 04:42:06 /usr/bin/gnome-shell3216 1403 root 0.1 0.4 04:42:01 containerd --config /var/run/docker/containerd/containerd.toml838 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.sock862 1 root 0.0 0.5 04:42:20 /usr/lib/snapd/snapd20331 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,cmdPID PPID USER STARTED ELAPSED %CPU %MEM CMD8357 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
基本参数
- 协议:
-tTCP,-uUDP - 过滤:
-l仅监听,-a全部,state指定状态 - 解析:
-n不反解(快),-p进程(需 root),-4/-6IPv4/IPv6 - 总览:
-s统计摘要
常用组合
- ss -tulnp 所有监听端口 + 进程
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))
- sudo ss -ltnp | grep ':9100 ’ 指定端口监听者
# ss -ltnp | grep ':9100 '
LISTEN 0 4096 *:9100 *:* users:(("node_exporter",pid=8357,fd=3))
- ss -tan state established 已建立 TCP 连接
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
- 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 |
