我使用的是 ubuntu 12.04,我在上面运行 ulimit -n ,它显示 1024, 我想将打开文件限制从 1024 增加到 65535,所以我尝试了以下命令:
sudo ulimit -n 65535
但我收到以下错误:
sudo: ulimit: command not found
如何将文件限制从1024增加到65535?任何帮助将不胜感激。
ulimit
是一个像 cd
一样的内置 shell,而不是一个单独的程序。 sudo
查找要运行的二进制文件,但没有 ulimit
二进制文件,这就是您收到错误消息的原因。
您有几个选择:
在较新的 Linux 版本上,通常有一个
prlimit
命令
是一个二进制文件,这意味着您可以在需要时sudo
它。
奔跑
prlimit --pid=$$ --nofile=65000:
增加当前shell的软限制。
$$
就是这么神奇
被解释为“当前 shell 的进程 ID。”
如果该命令抱怨“不允许操作”,
sudo prlimit
在大多数情况下都可以工作。
sudo prlimit --pid=$$ --nofile=65000
如果您仍然收到“不允许操作”的信息
sudo
,您可能会
遇到其他一些内核限制,例如超出允许的最大值
限制。
以前你只能靠跑步
sudo sh -c "ulimit -n 65535 && exec su $LOGNAME"
这可能仍然适用于较旧的 Linux 安装。它会给你一个新的 shell,没有 root 权限,但具有提高的限制。
exec
导致新的 shell 用 sudo
权限替换进程,所以
退出该 shell 后,您不会意外地再次以 root 身份结束。
然而,这在较新的(2022+?)发行版上似乎无法可靠地工作, 其中
su
重新应用默认限制。
prlimit
方法要好得多,因为你没有
运行 root shell 或分叉进程的安全问题
来自根外壳。如果你绝望了,一个危险的变体似乎
在新发行版上工作是可怕的事情 sudo -E sh -c "ulimit -n 65000 && exec setpriv --reuid=$(id -u) --regid=$(id -g) --inh-caps=-all --groups=$(groups|tr ' ' ,) -- env USER=\"$USER\" LOGNAME=\"$LOGNAME\" \"$SHELL\" --login"
。
然而,选项#1要简单得多,安全风险也小得多 观点,如果有的话你绝对应该使用它。
我过去不得不处理类似的问题。由于 shell 脚本没有 setuid 机制(因为它不安全),我发现用 setuid 编写一个简单的 C 包装器就足够了,然后在删除权限并执行 shell 之前使用系统调用来修改正在运行的进程的 ulimit脚本。