Linux - 解决“打开的文件太多”错误

gpi*_*ier 2 linux bash

在 RHEL 上,我有“打开的文件太多”错误。我想重现它,以便我了解究竟是什么导致了它。

  • cat /proc/sys/fs/file-max给出操作系统级别的最大打开文件。./file-nr给出当前打开的文件数
  • sudo lsof | wc -l是查看当前打开文件数量的另一种方法,尽管它包含此处提到的重复值。
  • ulimit -n 是每个进程的最大打开文件数(对我来说是 1024)
  • sudo lsof -p <PID> | wc -l给出lsof当前进程打开文件数的版本。

bash如果可能的话,我会寻求解决方案,这会创建一个ulimit -n仅通过打开虚拟文件来破坏的过程。潜在地,我还想使用其中几个测试过程来突破操作系统限制。

另外我怎样才能正确地杀死这样的进程?谢谢

这将使我能够准确地检查达到了什么限制(file-maxlsof...)并试验导致它的操作类型。

Cha*_*ffy 5

#!/usr/bin/env bash
case $BASH_VERSION in
  ''|[1-3].*|4.0.*) echo "ERROR: Bash 4.1 or newer required" >&2; exit 1;;
esac

[[ $1 ]] || { echo "Usage: $0 number-of-files" >&2; exit 1; }

echo "Running as process $$" >&2
for ((i=0; i<$1; i++)); do
  exec {fd_num}>/dev/null || {
    echo "Error on iteration $((i+1))" >&2
    break
  }
done

# if started from a TTY, let user press enter to exit
# otherwise (f/e, if run with </dev/null), keep running until we're killed
if [[ -t 0 ]]; then
  read -p "Press enter to exit this process:" _
else
  while :; do sleep 600 || exit; done
fi
Run Code Online (Sandbox Code Playgroud)

如果输出为Running as process 26941,则您可以ls -l /proc/26941/fd查看文件描述符是否真正在使用中(并计算它们,如果您选择的话)。