ulimit -a 显示的是当前 shell 进程及其子进程的资源限制,由 pam 模块 pam_limits.so 在登录时注入,包含软限制(用户可调低或在硬限内调高)和硬限制(仅 root 可提升)。

ulimit -a 是最直接、最可靠的查看当前会话软硬限制的方式,但要注意:它只反映当前 shell 的限制,不等于系统全局能力,也不代表所有服务已加载你改过的 /etc/security/limits.conf 配置。
ulimit -a 显示的是谁的限制?
显示的是**当前 shell 进程及其子进程**的资源限制,由 PAM 模块 pam_limits.so 在登录时注入。它包含两类值:
- 软限制(soft limit):用户可自行调低,或在不超过硬限制的前提下调高(如
ulimit -n 4096) - 硬限制(hard limit):仅 root 可提升,普通用户只能降低,是软限制的上限
常见字段中,open files (-n) 和 max user processes (-u) 最常被调优;unlimited 表示该限制未设上限(但实际仍受内核约束)。
为什么 ulimit -a 看到的和 limits.conf 不一致?
因为 /etc/security/limits.conf 的配置不会热生效,必须满足三个条件才真正加载:
- 用户需**全新登录会话**(不是
source ~/.bashrc或新开 terminal 标签页) - PAM 必须启用
pam_limits.so,检查/etc/pam.d/sshd或/etc/pam.d/login是否含session required pam_limits.so - 若
/etc/security/limits.d/下有同名参数配置(如20-nproc.conf),它会覆盖limits.conf中的相同项
验证是否生效,别只信配置文件内容,执行:bash -c "ulimit -n" 或 cat /proc/self/limits | grep "Max open files"。
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
limits.conf 里 * 和用户名的区别是什么?
* 匹配所有**非 root 用户**,root 用户不受其影响(除非显式写 root)。这是个长期被误用的点:
- 想给所有用户(含 root)设限,得分别写
root和*两行 -
www soft nofile 65536只对用户www生效,且仅当它通过 login/shell 启动进程时才加载(systemd 服务默认绕过 limits.conf) - systemd 服务要生效,必须在 service 文件里加
LimitNOFILE=65536,否则limits.conf对它完全无效
系统级文件描述符上限在哪看?
ulimit -n 再大,也跨不过内核天花板 /proc/sys/fs/file-max:
- 查当前系统总容量:
cat /proc/sys/fs/file-max - 查已分配/已使用量:
cat /proc/sys/fs/file-nr(三列:已分配、已释放、最大) - 临时调高:
echo 2097152 > /proc/sys/fs/file-max - 永久生效:写入
/etc/sysctl.conf,加一行fs.file-max = 2097152,再运行sysctl -p
注意:nofile 的 hard limit 不能超过 /proc/sys/fs/nr_open 的值,否则 limits.conf 会被静默忽略。
真正容易被忽略的是:systemd 服务、docker 容器、supervisord 托管的进程,它们基本不走 PAM 流程,limits.conf 对它们形同虚设——得去各自的服务管理层单独配限制。










