在Linux中限制用户最大进程数需配置/etc/security/limits.d/下的nproc软硬限制、启用pam_limits.so模块、验证ulimit -u及fork炸弹拦截效果,并针对systemd服务和系统级pid_max做相应调整。

在 Linux 中限制用户最大进程数,核心是控制 nproc(number of processes)这一资源项,需兼顾用户级、系统级和运行环境三方面,缺一不可。
用 /etc/security/limits.d/ 配置用户级限制(推荐)
生产环境应避免直接修改 /etc/security/limits.conf 主文件,而是创建独立配置文件,便于维护和回滚:
- 新建文件如
/etc/security/limits.d/30-user-nproc.conf(序号控制加载顺序) - 写入目标用户的软硬限制,例如限制账号
devuser最多运行 200 个进程:devuser soft nproc 200devuser hard nproc 200 - 若需限制所有普通用户(不含 root),可用通配符:
* soft nproc 300* hard nproc 300 - root 用户不受
*或组规则影响,如需限制,必须显式写:root soft nproc 1000root hard nproc 1000
确认 PAM 模块已启用
limits.d 下的配置不会自动生效,依赖 PAM 加载 pam_limits.so:
- 检查
/etc/pam.d/sshd(SSH 登录)或/etc/pam.d/common-session(通用会话)中是否存在:session required pam_limits.so - Debian/Ubuntu 系统模块路径通常为
/lib/x86_64-linux-gnu/security/pam_limits.so,RHEL/CentOS 一般为/lib64/security/pam_limits.so - 修改后无需重启服务,新登录会话即生效;已有会话需完全登出重进,或执行
su - $USER
验证是否真正生效
配置完成后务必验证,避免静默失败:
- 以目标用户身份重新登录,执行
ulimit -u,应显示你设定的数值(如200) - 测试 fork 炸弹拦截效果:
:(){ :|:& };:—— 若几秒内报错bash: fork: Resource temporarily unavailable,说明限制已起作用 - 注意:普通用户只能调低自己的软限制(
ulimit -S -u 150),无法突破硬限制;root 可临时提升,但不建议绕过防护策略
补充:systemd 服务与系统级上限
如果被限制的是 systemd 启动的服务(如 Java、Nginx),limits.d 配置对其无效:
- 单服务配置:编辑其 service 文件,在
[Service]段添加:LimitNPROC=200 - 全局配置(慎用):在
/etc/systemd/system.conf中设:DefaultLimitNPROC=200,再执行systemctl daemon-reload - 系统级 PID 上限也要匹配:若
ulimit -u设为 2000,但/proc/sys/kernel/pid_max仍为默认 32768,高并发时仍可能因 PID 耗尽失败;建议同步调整:echo 4194304 > /proc/sys/kernel/pid_max(临时)
或在/etc/sysctl.conf中加kernel.pid_max = 4194304(永久)


















