nproc 限制防的是 fork 炸弹,不是僵尸进程;它通过限制用户最大活跃进程数,使 fork() 超限时返回 eagain,从而阻断 fork 炸弹扩散,而僵尸进程仅占 pid 表项、不参与 fork,无法触发该限制。

不能靠 /etc/security/limits.conf 的 nproc 防止“僵尸进程”引发 fork 炸弹——因为僵尸进程(zombie process)本身不消耗 fork 能力,也不会触发 fork 炸弹;真正需要限制的是**普通用户可创建的活跃进程总数**,即 nproc 控制的“最大用户进程数”,它防的是 fork 炸弹本身,不是僵尸进程。
明确概念:僵尸进程 ≠ fork 炸弹诱因
僵尸进程是已终止但尚未被父进程 wait() 回收的子进程,只保留一个进程表项,不占内存、不调度、也不能再 fork。它既不会自我复制,也不会拖垮系统——大量僵尸进程通常是父进程 bug 或异常退出所致,而非攻击行为。fork 炸弹(如 :(){ :|:& };:)则持续调用 fork() 创建新进程,耗尽 PID 空间和内存,导致系统无响应。防护目标是让 fork() 在达到阈值时直接失败。
nproc 限制防的是 fork 炸弹,不是僵尸进程
nproc 字段在 limits.conf 中专用于限制单个用户可同时存在的**最大进程数(含线程)**,内核在用户调用 fork() 时检查该值,超限即返回 EAGAIN,bash 报错 fork: Resource temporarily unavailable,从而中断炸弹扩散。
- 设置
alice hard nproc 200后,alice 用户所有进程(包括 shell、编辑器、后台任务等)总数不能超过 200 - 一旦接近上限,
:(){ :|:& };:运行几轮就会卡住,无法继续派生 - 僵尸进程计入
nproc统计(它仍占一个 PID 表项),但仅靠僵尸进程堆不满限制——正常系统中僵尸数极少;真正危险的是活进程指数级增长
正确配置 limits.conf 的关键操作
要让 nproc 发挥实效,必须满足三个条件:
- 同时设置 soft 和 hard:只写
soft允许用户自行调高;只写hard则初始值仍是系统默认(常为 1024+),起不到压制作用。推荐写两行:alice soft nproc 150alice hard nproc 150 - 确保 PAM 加载
pam_limits.so:检查grep "pam_limits.so" /etc/pam.d/{sshd,login,su,system-auth},缺失则在/etc/pam.d/sshd末尾添加:session required pam_limits.so - 重新登录生效:修改后需新登录会话(或
su - alice)才能加载,运行ulimit -u验证是否显示设定值
补充建议:避免常见误配
生产环境加固还需注意:
- 慎用通配符
*:写* hard nproc 200会影响所有非 root 用户,包括daemon、syslog等服务账户,可能使 cron、dbus 或 systemd --user 异常 - root 不受
*或组规则影响:如需限制 root,必须显式写root hard nproc 1000 - systemd 用户服务绕过 limits.conf:若应用以
systemctl --user启动,需额外在/etc/systemd/system.conf中设DefaultLimitNPROC=200 - 容器环境无效:Docker/Podman 中需用
--pids-limit,ulimit和limits.conf不起作用











