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

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

为了增加 Ubuntu Linux 机器上以无头用户身份运行的守护进程的 FD 限制,我们在 /etc/security/limits.conf 中进行了以下更改

soft nofile 10000
hard nofile 10000

我们还在 /etc/pam.d/login 中添加了会话所需的 pam_limits.so。更改反映在所有注销并再次登录的用户身上。这些用户下启动的任何新进程都会获得新的 FD 限制。

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

答案1

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

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

答案2

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

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

答案3

重启肯定能解决问题。但我想你会想避免这种情况。(谁不想呢?)

因此,您需要 HUP init 进程。它几乎总是在 PID 1 上运行,但您可能需要仔细检查您的系统。这不是最安全的做法,但它可以避免重新启动。因此,请先在测试机上尝试此操作:

kill -HUP 1

答案4

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

找到要更改的进程 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 提到的方法。

相关内容