为了增加 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 提到的方法。