是的,我知道这个问题之前有人问过,我尝试了所有我见过的解决方案,但没有一个对我有用。我们正在运行 Ubuntu 12,并且我们有一个进程,每次机器启动时都会由 upstart 自动启动。我进入了 /etc/security/limits.conf 并添加了以下几行:
* hard nofile 65000
* soft nofile 32000
root hard nofile 65000
root soft nofile 32000
我还进入 /etc/pam.d/common-session 并添加了以下行:
session required pam_limits.so
为了使其适用于非交互式进程,我还进入了 /etc/pam.d/common-session-noninteractive 并添加了完全相同的行。
当我以管理员用户身份登录(在 sudo 列表中,我将此用户称为 SUDOUSER)时,当我执行 ulimit -a 时,我看到限制现在是 32000,正如预期的那样。
然后我重新启动整个机器,以确保限制适用于新进程,例如重启后由 upstart 启动的进程。
但是,重启后,当我查看运行时启动的持久进程时,我得到了进程 ID(例如 12345),然后执行 cat /proc/12345/limits 并且我看到限制仍然是默认值(软限制 1024,硬限制 4096)。
那么我做错了什么?
答案1
好的,我找到了解决方案。事实证明,upstart 忽略了 pam.d 和 limits.conf 中的所有限制。在 upstart 中执行此操作的方法是在 upstart conf 脚本中为该进程明确设置限制。因此,假设该进程是 myproc,并且您有一个文件 /etc/init/myconf.conf。在此脚本中,只需在顶部附近的某处包含此行:
limit nofile 32000 65000
确保此行独立存在 - 它没有放在脚本或者预启动脚本等里面 - 它本身就是一条主线(或者“节”)。
现在只需重新启动该进程并使用 cat /proc/12345/limits 查看限制