Linux-Kernel

Linux - 打開文件繼承

  • October 1, 2016

為了進行測試,我將全域打開文件限制更改為 3000:

#sysctl -w fs.file-max=3000
fs.file-max = 3000

#cat /proc/sys/fs/file-nr
2016    0       3000

我創建了一些文件:

i=1; while [ "$i" -le 1000  ]; do : >> "$i"; i=$(($i + 1)); done

我把它們打開了:

i=1; while [ "$i" -le 1000  ]; do less  "$i" & ; i=$(($i + 1)); done

我已經看到了我剛剛製造的混亂:

ksh: /bin/less: cannot execute [Too many open files in system]

我知道我達到了極限……

# cat  /proc/sys/fs/file-nr
3008    0       3000

如果我現在提高打開文件限制(這樣我就可以使用另一個控制台進行 ssh 了)並且如果我在將打開文件最大值設置為 3000 後檢查最近生成的一個較少的文件,我會看到:

# cat /proc/28282/limits  | grep 'Max open files'
Limit                     Soft Limit           Hard Limit       Units
Max open files            1024                 16384            files

“硬限制”仍然設置得很高,雖然沒有提到 3000。所以我們達到了系統限制,而不是每個程序的限制。

為什麼不指示新創建的程序繼承 3000 vs 16384?

我用新的 shell 登錄了一個新的終端,那麼為什麼我的 shell 不被告知 3000 並將其傳遞給 less?

這是一個 2.6.32 核心

根據此連結Ulimit 文件描述符限制不適用於特定程序

我引用:

“/etc/security/limits.conf 是 pam_limits 的一部分,因此在此文件中設置的限制由 pam_limits 模組在登錄會話期間讀取。登錄會話可以通過 ssh 或通過終端”

/etc/sysctl.conf 是系統範圍的全域配置,我們不能在這裡設置使用者特定的配置。它設置了所有使用者/程序可以使用的最大資源量”

/etc/sysctl.conf 不是設置它的正確位置。

我需要全面調查 /etc/security/limits.conf 和“pam_limits”

引用自:https://serverfault.com/questions/806412