在 Debian(以及大多数 Linux 发行版)中,ulimit 默认只对当前 shell 会话生效,不是永久生效的。但可以通过配置文件或 systemd / PAM 等方式实现“永久生效”。
下面按使用场景详细说明。
ulimit 是 shell 内建命令,只在当前 shell 及其子进程中有效:
ulimit -n 65535
退出 shell 或重启系统后失效。
/etc/security/limits.conf(最常用)适用于:
su / sudosudo vim /etc/security/limits.conf
在末尾添加:
* soft nofile 65535
* hard nofile 65535
或指定用户:
www-data soft nofile 65535
www-data hard nofile 65535
检查 /etc/pam.d/common-session 或登录相关文件是否包含:
session required pam_limits.so
Debian 默认一般已启用。
logout
ssh user@host
ulimit -n
✅ 这是最标准、最推荐的方式
⚠️ systemd 默认忽略 limits.conf
sudo vim /etc/systemd/system.conf
DefaultLimitNOFILE=65535
sudo vim /etc/systemd/user.conf
DefaultLimitNOFILE=65535
然后重启:
sudo systemctl daemon-reexec
reboot
sudo systemctl edit nginx
[Service]
LimitNOFILE=65535
sudo systemctl restart nginx
查看:
cat /proc/$(pgrep nginx | head -1)/limits
编辑:
vim ~/.bashrc
ulimit -n 65535
❌ 不推荐用于服务 ✅ 仅适合交互 shell
| 误区 | 说明 |
|---|---|
修改 /etc/profile |
只对登录 shell 有效 |
修改 /etc/sysctl.conf |
控制内核参数,不是 ulimit |
| systemd 服务不生效 | 必须单独设置 LimitNOFILE |
| Docker 容器不生效 | 需要在宿主机或 docker run 中设置 |
ulimit -n
或查看进程:
cat /proc/<PID>/limits
| 场景 | 推荐方式 |
|---|---|
| 普通用户 | /etc/security/limits.conf |
| systemd 服务 | systemctl edit + LimitNOFILE |
| 全局 systemd | system.conf |
| 临时测试 | ulimit |
如果你愿意,可以告诉我:
我可以给你精确到命令级别的配置方案。