今天使用sudo發(fā)現(xiàn)報錯,百度無果,最后從提示入手排查進程數(shù)解決了該問題
該錯誤是由于root正在運行的核心線程數(shù)(了解后這里processes是指LWP(light weight process輕量級進程,每個輕量級進程對應一個核心線程))多于當前用戶所允許使用的核心線程數(shù)數(shù)量,導致無法切換到root權(quán)限引起的報錯
1.png
該核心線程數(shù)限制的配置在/etc/security/limits.d/90-nproc.conf文件
2.png
如上圖所示,root用戶允許啟動的線程數(shù)為unlimited,即無限制,除此之外的所有用戶允許啟用的線程為1024個
使用下面的命令可以查看每個用戶的線程數(shù)量
ps h -Led -o user | sort | uniq -c | sort -n
參數(shù)說明:
h 隱藏表頭,用于統(tǒng)計時不影響統(tǒng)計結(jié)果
L 以線程維度展示數(shù)據(jù)
e 展示所有用戶的線程
d 展示線程的ID(可以不用這個參數(shù))
o 可選項,此處取值user為只展示進程的用戶名
sort命令:排序
uniq -c 統(tǒng)計重復數(shù)據(jù)出現(xiàn)的數(shù)量
如圖所示,root用戶有2574個線程,超出當前用戶可用線程數(shù),因此sudo -i報錯
3.png
用以下命令確定是哪個進程的線程過多
cat `ls /proc/|grep [0-9][^a-z]|awk '{print "/proc/"$1"/status"}'`|grep -w -E -i 'Pid|Threads'
參數(shù)說明:
ls /proc/|grep [0-9][^a-z] :列出所有進程號
awk '{print "/proc/"$1"/status"}':拼接成“/proc/{進程號}/status”的形式,該文件有進程的詳細信息
最后cat每一個“/proc/{進程號}/status”文件,再用grep正則匹配出記錄了Pid那行和Threads那行
如圖所示,確定是5435這個pid的進程線程數(shù)有2257個
4.png
解決方案,重啟電腦或用root賬號登錄后kill掉該進程就可以了



