温馨提示×

Debian ulimit能否永久生效

小樊
34
2026-07-11 23:50:44
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)中,ulimit 默认只对当前 shell 会话生效不是永久生效的。但可以通过配置文件或 systemd / PAM 等方式实现“永久生效”。

下面按使用场景详细说明。


一、为什么 ulimit 不是永久生效?

ulimitshell 内建命令,只在当前 shell 及其子进程中有效:

ulimit -n 65535

退出 shell 或重启系统后失效。


二、实现“永久生效”的几种方式(推荐)

✅ 方式一:修改 /etc/security/limits.conf(最常用)

适用于:

  • 登录用户
  • SSH 登录
  • su / sudo

1️⃣ 编辑配置文件

sudo vim /etc/security/limits.conf

在末尾添加:

* soft nofile 65535
* hard nofile 65535

或指定用户:

www-data soft nofile 65535
www-data hard nofile 65535

2️⃣ 确保 PAM 启用(非常重要)

检查 /etc/pam.d/common-session 或登录相关文件是否包含:

session required pam_limits.so

Debian 默认一般已启用。

3️⃣ 重新登录生效

logout
ssh user@host
ulimit -n

这是最标准、最推荐的方式


✅ 方式二:systemd 服务(服务进程必看)

⚠️ systemd 默认忽略 limits.conf

方法 1:修改 systemd 全局配置

sudo vim /etc/systemd/system.conf
DefaultLimitNOFILE=65535
sudo vim /etc/systemd/user.conf
DefaultLimitNOFILE=65535

然后重启:

sudo systemctl daemon-reexec
reboot

方法 2:单独服务设置(推荐)

sudo systemctl edit nginx
[Service]
LimitNOFILE=65535
sudo systemctl restart nginx

查看:

cat /proc/$(pgrep nginx | head -1)/limits

✅ 方式三:只对当前用户永久生效(bash)

编辑:

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

如果你愿意,可以告诉我:

  • Debian 版本
  • 普通用户 / root / 某个服务(如 Nginx、MySQL、Docker)

我可以给你精确到命令级别的配置方案。

0