如何增加在无头用户下运行的守护进程的最大FD限制?

为了提高Ubuntu Linux机器上无头用户下运行的守护进程的FD限制,我们在/etc/security/limits.conf

soft nofile 10000 hard nofile 10000 

我们还在/etc/pam.d/login中添加了session required pam_limits.so。 所有已注销并重新login的用户都会反映这些更改。 无论新用户开始什么新的stream程,都会获得新的FD限制。

但是对于在无头用户下运行的守护进程来说,这些变化并没有得到体现。 在无头用户下运行的守护进程可以如何反映这些变化?

问题在于守护进程启动脚本。 它使用setuidgid在无头的用户下运行守护程序。看起来像setuidgid不会在更改用户/组的过程中安装在limits.conf中设置的资源限制。 守护进程应该照顾通过启动脚本为自己设置资源限制。 通过在启动脚本中为当前会话设置最大FD限制,新的限制反映在守护进程中。这是通过在守护进程的lauching脚本中插入一个ulimit -n行来完成的。

 ulimit -n $NEW_MAX_LIMIT exec setuidgid userxyz /pat/to/daemon.sh 

您可以使用prlimit(1)(util-linux的一部分)读取/设置正在运行的进程的资源限制:

 sudo prlimit --pid PID --nofile 8192:16384 

重新启动肯定会照顾它。 但我想你想避免这种情况。 (谁不?)

所以你将需要HUP的init进程。 它几乎总是在PID 1上运行,但是您可能要仔细检查一下您的系统。 这不是最安全的事情,但可以避免重启。 所以请先在testing盒上试试这个:

kill -HUP 1

您可以使用procfs设置正在运行的进程的限制。

find要更改的进程ID(在本例中为1234),然后运行:

 pid=1234 # This is the process ID, found with `ps`. h_nofile=16384 # hard limit of "Max open files" s_nofile=8192 # soft limit of "Max open files" grep "Max open files" /proc/$pid/limits echo -n "Max open files=$s_nofile:$h_nofile" > /proc/$pid/limits grep "Max open files" /proc/$pid/limits 

最近的内核不再支持这种方法。 另一种方法是使用prlimit作为@nous提到的。