大量残留 network namespace 的 ip netns delete 批量脚本-SQL

ip netns delete 失败的根本原因是 namespace 仍被进程、veth 设备、iptables 规则或 systemd 会话引用;必须解除所有引用才能删除。

为什么 ip netns delete 会失败或残留?

根本原因不是命令本身不支持批量,而是每个 namespace 必须处于“未被任何进程或网络设备引用”的状态才能删除。常见卡点包括:
• 进程仍持有该 netns 的文件描述符(比如容器未彻底退出、nsenter 残留 shell)
• veth 对端仍挂在 host 或其他 netns 中(ip link 显示 netns XXX 但 XXX 已删)
• 有绑定到该 netns 的 iptables/nftables 规则(尤其使用 -t nat 或自定义链时)
• systemd 用户 session 持有 netns 引用(systemd-run --scope --scope-netns 启动的服务未 clean up)

安全批量清理残留 netns 的 bash 脚本

以下脚本先做软清理(尝试优雅删除),再强制解除引用,最后硬删目录。关键点是绕过 /var/run/netns/ 符号链接校验,直接操作底层 bind mount:

#!/bin/bash
for ns in $(ip netns list | awk '{print $1}'); do
    echo "处理 netns: $ns"
    # 尝试正常删除
    if ip netns delete "$ns" 2>/dev/null; then
        continue
    fi
    # 若失败,检查是否有进程在用
    pid=$(ls -la /proc/[0-9]*/ns/net 2>/dev/null | grep "$ns" | head -n1 | cut -d' ' -f3 | cut -d'/' -f3)
    if [ -n "$pid" ]; then
        echo "  PID $pid 正在使用,发送 SIGTERM"
        kill "$pid" 2>/dev/null
        sleep 0.5
        kill -9 "$pid" 2>/dev/null
    fi
    # 解除 veth 引用(host 端口若名含 ns 名,移除)
    ip link show | grep -E "^[0-9]+:" | cut -d':' -f1 | xargs -I{} sh -c 'ip link show {} | grep -q "netns.*'"$ns"'" && ip link delete {} 2>/dev/null'
    # 最终强制删目录(注意:仅当确认无进程引用后才执行)
    rm -f "/var/run/netns/$ns"
done

ip netns delete 失败时的快速诊断命令

别急着删,先定位卡在哪:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 大量残留 network namespace 的 ip netns delete 批量脚本-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002412+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002412+
  • 本周更新: 0+
  • 最后更新: 2026-03-16