在 Debian(以及大多数 Linux 发行版)中,ulimit 设置“不生效”通常不是命令本身的问题,而是设置位置、作用范围或 systemd 的限制导致的。下面按常见原因逐一说明,并给出对应的解决办法。
ulimit 只对当前 shell 及其子进程生效
ulimit -n 65535
只在当前 shell 会话中有效,退出后失效。
普通用户不能“调大”超过硬限制
ulimit -Hn # 查看硬限制
ulimit -Sn # 查看软限制
/etc/profile / ~/.bashrc 里设置但没用ulimit -n 65535
原因
✅ 解决
/etc/security/limits.confpam_limits.so/etc/security/limits.conf 依赖 PAM。
检查
grep pam_limits /etc/pam.d/common-session
如果没有:
session required pam_limits.so
✅ 解决
echo "session required pam_limits.so" >> /etc/pam.d/common-session
⚠️ 修改后重新登录才生效(不是 source)
这是 Debian 10+ / systemd 系统最常见原因。
即使你设置了:
* soft nofile 65535
* hard nofile 65535
✅ systemd 服务仍然不生效
编辑服务:
systemctl edit your.service
添加:
[Service]
LimitNOFILE=65535
然后:
systemctl daemon-reexec
systemctl restart your.service
验证:
cat /proc/$(pidof your_service)/limits
Debian 默认值:
如果你写:
* hard nofile 100000
但系统最大是 1048576,看起来“没生效”是正常的。
✅ 建议
* soft nofile 65535
* hard nofile 65535
ulimit 在容器里由宿主机控制。
✅ Docker 示例:
docker run --ulimit nofile=65535:65535 ...
❌ 在容器里 ulimit -n 65535 通常无效
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
并确认:
/etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive
# /etc/systemd/system.conf
DefaultLimitNOFILE=65535
或 per service:
[Service]
LimitNOFILE=65535
# 当前 shell
ulimit -n
# 进程
cat /proc/$(pidof xxx)/limits
# systemd
systemctl show your.service | grep Limit
ulimit 不生效,99% 是 systemd 或 PAM 的问题,而不是 ulimit 本身。
如果你愿意,可以把你的 使用场景(SSH 用户 / systemd 服务 / Docker / 数据库)贴出来,我可以直接给你一份“可复制可用”的配置。