在 Debian(以及大多数 Linux 发行版)里,ulimit “不生效”通常不是命令本身的问题,而是作用范围 / 配置位置 / 服务管理方式不对。下面按最常见原因逐条说明。
ulimit 只对“当前 shell 及其子进程”有效ulimit -n 65535
这只对:
有效,不会影响:
✅ 验证:
ulimit -n
在同一 shell里看才有效。
/etc/security/limits.conf 但没生效(最常见)* soft nofile 65535
* hard nofile 65535
limits.conf 依赖 PAM:
# 确认以下文件包含
session required pam_limits.so
检查:
grep pam_limits /etc/pam.d/common-session
grep pam_limits /etc/pam.d/login
以下情况 不会读取 limits.conf:
cronsystemd 服务docker✅ 只有:
su -(注意有 -)❌ 错误:
su root
✅ 正确:
su - root
ulimit / limits.conf这是 Debian 9+ 最常见坑
systemctl start nginx
ulimit -n 不生效
systemd 不读:
/etc/security/limits.confulimit在 service 文件里加:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
然后:
systemctl daemon-reexec
systemctl restart xxx
验证:
cat /proc/<pid>/limits
Docker 默认继承宿主机限制,但:
docker run --ulimit nofile=65535:65535 ...
或 docker-compose:
ulimits:
nofile:
soft: 65535
hard: 65535
ulimit -Hn
如果你当前是:
-Hn 1024
那:
ulimit -n 65535
会失败。
✅ 必须:
/etc/security/limits.conf只有:
才能提高 hard limit
sysctl fs.file-max
如果太小:
fs.file-max = 100000
修改:
/etc/sysctl.conf
fs.file-max = 1000000
sysctl -p
# 当前 shell
ulimit -a
# 进程实际限制
cat /proc/$$/limits
# systemd 服务
systemctl show <service> | grep Limit
# 登录方式
echo $0
Debian 上 ulimit 不生效,90% 是因为:你改的地方不是进程真正启动的地方。
如果你愿意,可以告诉我:
我可以直接给你精确配置。