netstat 在现代 linux 中仍可用但非默认预装,需手动安装 net-tools 包;不加 sudo 无法显示进程名,因内核限制非 root 用户访问 socket 信息;推荐用 ss 或 lsof 替代,更高效可靠。

netstat 在现代 Linux 上仍能用,但不是“开箱即用”——多数最小化系统(CentOS 8+、Ubuntu 22.04+、容器镜像)默认不带,且不加 sudo 基本看不到进程名。
netstat -tulnp 为什么常报 command not found
因为 netstat 属于 net-tools 包,不是独立二进制文件。很多新系统默认不装它:
- Ubuntu/Debian:运行
sudo apt install net-tools - CentOS/RHEL 8+:运行
sudo dnf install net-tools(或yum) - Alpine:用
apk add net-tools - 某些 distroless 或 scratch 容器镜像:根本没法装,得换
ss或lsof
sudo netstat -tulnp 输出里 PID/Program name 是 - 或空怎么办
这是权限问题,不是命令写错了。Linux 内核禁止非 root 用户读取其他进程的 socket 信息(路径如 /proc/[pid]/fd/),即使你 own 该进程也不行:
- 必须用
sudo,否则-p参数失效 - 某些 systemd --user 服务、容器内进程,即使有 root 权限也显示不出进程名,这时
ss -tulnp或lsof -i :端口更可靠 -
Local Address列看到127.0.0.1:8080表示只监听本地回环,外部连不上——不是端口没起来,是绑定地址太窄
grep :80 为什么有时漏掉结果或误匹配
netstat 输出中 IPv4 和 IPv6 格式不一致:0.0.0.0:80 vs [::]:80,而 grep :80 只能匹配前者,还可能把 :8080 也抓进来:
- 安全写法是
sudo netstat -tulnp | grep -E ':(80|:80)\b'(\b是单词边界) - 更推荐直接用
sudo ss -tulnp | grep ':80\b',速度快、格式统一、默认预装 - 如果只想看 TCP,去掉
-u参数,避免 UDP 端口干扰输出
netstat 查到 PID 后怎么杀进程
netstat 输出里的 PID/Program name 列给出的是数字 PID,但别急着 kill -9:
- 先确认是不是你要关的服务:
ps -p PID -o pid,ppid,cmd,%mem,%cpu - 优先用
systemctl stop service_name(比如nginx、mysql),避免残留状态 - 真要强制杀,用
sudo kill -9 PID;若多个进程共用端口,sudo fuser -k 80/tcp更干脆 - 注意:杀错 PID 可能导致数据库崩溃、服务中断,尤其生产环境务必二次确认
实际执行时最容易被忽略的点是:IPv6 地址格式和权限限制不是 bug,是设计如此。别指望不加 sudo 就看到进程名,也别以为 grep :80 能覆盖所有情况——这些细节不处理好,排查就卡在第一行输出里。











