在 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-max或lsof...)并试验导致它的操作类型。
#!/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查看文件描述符是否真正在使用中(并计算它们,如果您选择的话)。