使用sudo ulimit时出现命令未找到的错误

64

我使用的是Ubuntu 12.04,在上面运行ulimit -n命令,结果显示为1024。我想将我的打开文件限制从1024增加到65535,因此我尝试了以下命令:

sudo ulimit -n 65535

但我收到了以下错误:

sudo: ulimit: command not found

如何将文件限制从1024增加到65535?非常感谢您的帮助。


1
除非涉及主要用于编程的工具,否则有关一般计算硬件和软件的问题不适合在Stack Overflow上提问。您可以在Unix&Linux上获得帮助。 - Danny Beckett
这个问题对于MongoDB很有用,我已经添加了该标签。 - jcollum
Unix新问题:http://unix.stackexchange.com/questions/81843/sudo-ulimit-command-not-found - Ciro Santilli OurBigBook.com
2个回答

124
是一个像cd一样的shell内置命令,而不是一个独立的程序。sudo会寻找要运行的二进制文件,但没有ulimit二进制文件,这就是为什么你会收到错误消息的原因。
你有几个选择:
在较新的Linux版本中,通常会有一个名为prlimit的命令,它是一个二进制文件,这意味着如果需要的话,你可以使用sudo来执行它。
运行以下命令来增加当前shell的软限制:prlimit --pid=$$ --nofile=65000。其中$$是一个特殊符号,表示“当前shell的进程ID”。
如果该命令报错“Operation not permitted”,大多数情况下可以使用sudo prlimit来解决: sudo prlimit --pid=$$ --nofile=65000 如果使用sudo仍然出现“Operation not permitted”的错误,可能是因为遇到了其他内核限制,比如超过了最大允许限制。
以前可以通过以下方式来提高限制并创建一个新的shell,但在较新的Linux安装中可能不太可靠: sudo sh -c "ulimit -n 65535 && exec su $LOGNAME" 这将给你一个没有root权限但具有提高限制的新shell。exec命令会使新的shell替换掉具有sudo权限的进程,因此在退出该shell后,你不会意外地再次成为root用户。
然而,在较新的(2022年以后的)发行版中,这种方法似乎不太可靠,因为su会重新应用默认限制。
相比之下,prlimit方法要好得多,因为你不必担心运行一个root shell或者从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要简单得多,从安全角度来看风险也小得多,如果可行的话,你应该绝对使用它。

对我来说,稍作调整就完美解决了: sudo sh -c“ulimit -u 1000000 && ulimit -n 100000 && exec su $LOGNAME” - Dasmowenator
请注意,这会使用户失去一个环境。 - user367890
1
其实我还不明白 sudo sh -c "ulimit -c 1024 && exec su $LOGNAME" 如何解决任何问题。 - Tim
谢谢。另一个解释请参见 https://gist.github.com/ntamvl/017ce61db2d3c6b9c595f2fac8eeac3c - Isuru Hemantha

0

我以前也遇到过这样的问题。由于 shell 脚本没有 setuid 机制(因为不安全),我发现编写一个简单的 C 包装器并使用 setuid 进行系统调用来修改正在运行进程的 ulimits,然后降低权限并执行您的 shell 脚本是足够的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接