prlimit 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于进程与系统族。它弥补了 ulimit 的最大短板——ulimit 只能影响当前 shell 及其新子进程,而 prlimit 能对已经运行的进程在线查看和修改限制,不必重启。
一、查看
bash
prlimit # 当前 shell 的全部限制
prlimit --pid 1234 # 指定进程的全部限制(等价 cat /proc/1234/limits)
prlimit --pid 1234 --nofile # 只看打开文件数(soft/hard)
prlimit --nproc --pid 1234 # 只看进程数输出同时给出 SOFT 和 HARD 两列,比 ulimit -aS/-aH 分两次看更直接。
二、在线修改运行中进程
bash
# 把已运行进程的 nofile 软/硬限制都提到 1048576,无需重启
sudo prlimit --pid 1234 --nofile=1048576:1048576
# 等价单项写法:只调 soft
sudo prlimit --nofile 65536 --pid 1234格式 资源=soft:hard;只给一个值时 soft、hard 同设。常见资源名:
| 资源名 | 对应 |
|---|---|
--nofile | 打开文件描述符 |
--nproc | 进程/线程数 |
--core | core 转储大小 |
--stack | 栈大小 |
--memlock | 锁定内存 |
--cpu | CPU 时间秒 |
--as | 虚拟地址空间 |
三、启动子进程时预设
prlimit 还能像 ulimit + exec 一样带限制启动命令:
bash
prlimit --nofile=65536 -- ./server --port 8080
prlimit --as=2G:2G -- ./memhog # 限虚拟内存 2G四、和 ulimit / limits.conf 的取舍
| 方式 | 作用对象 | 生效 |
|---|---|---|
ulimit | 当前 shell 及之后派生的子进程 | 临时,重开失效 |
prlimit --pid | 任意已运行进程 | 立即,无需重启(急救首选) |
limits.conf | PAM 登录会话 | 需重新登录/重启服务 |
systemd LimitNOFILE= | 该 service | daemon-reload + restart |
生产应急(服务快撞 fd 上限又不能立刻重启)可先
prlimit --nofile在线抬上去止血,再补 systemdLimitNOFILE/limits.conf 做持久化,避免下次重启回到旧值。同样不能越过内核fs.nr_open单进程硬顶。改多线程进程时作用于进程级 rlimit(线程共享)。
相关命令
概念与各项含义见 ulimit 详解,验证 fd 用量用 lsof/
ls /proc/pid/fd,容器/namespace 相关见 nsenter。
总结
prlimit = 可对任意 PID 在线查看/修改 rlimit 的工具:--pid 看 soft/hard、--nofile=soft:hard 不改配置不重启就能给运行中的服务抬 fd 等限制,是生产急救的止血手段;但它不持久化,事后仍要用 systemd LimitNOFILE 或 limits.conf 固化,且同样受 nr_open 约束;相比 ulimit 只管当前 shell,prlimit 的核心价值是"动已经在跑的进程"。