Linux
Linux沒有正確執行限制?
作為測試系統上的實驗,我嘗試使用
/etc/security/limits.conf
. 登錄系統時,我有 16 個以我的名義執行的程序(所有程序都有 ruid、euid 和 suid 到我的 uid)。我首先嘗試將硬限制和軟限制設置為 20。我註銷並且無法再次登錄,因為我無法創建程序。我將限制提高到 30,但我仍然無法進入。當我將限制提高到 50 個程序時,我可以進入,但
zsh
出現了一些錯誤。我發現我可以再創建 2 個程序,僅此而已。我的問題是,為什麼如果我將限制設置為 N(在本例中為 20),它並不能完全強制將 N 個程序作為限制?如果使用者接近它,它會觸發限制嗎?否則我不明白為什麼當我仍有空間低於限制時它不允許我創建更多程序。
在標準 Debian(基於 systemd)上執行 Linux 4.19
編輯:
要計算我嘗試過的過程:
ps ux
:這會產生 14 個程序並且為了很好的衡量
cat /proc/*/status | grep Uid | grep 1000 | wc -l
: 產生 16 個程序。由於 oneliner 使用的額外過程而導致的預期差異。
grep 1000
(我的 uid)的輸出是:Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000 Uid: 1000 1000 1000 1000
這表明所有執行都是真實的、有效的、已保存的和 fsuid 1000(我)
我相信我有 13 個程序,因為我信任它
ps
並且它自己計算,所以它應該是 13 對嗎?
根據
man 2 setrlimit
:RLIMIT_NPROC This is a limit on the number of extant process (or, more precisely on Linux, threads)
可以說,這有點違反直覺。在任何情況下,當登錄程序設置為 20 或 30 時,可能會產生許多超出限制的執行緒。
我測試了登錄,然後降低了限制,並分叉了簡單的單執行緒程序,直到出現錯誤。限制的行為符合預期。