今天使用sudo发现报错,百度无果,最后从提示入手排查进程数解决了该问题
该错误是由于root正在运行的核心线程数(了解后这里processes是指LWP(light weight process轻量级进程,每个轻量级进程对应一个核心线程))多于当前用户所允许使用的核心线程数数量,导致无法切换到root权限引起的报错
该核心线程数限制的配置在/etc/security/limits.d/90-nproc.conf文件
如上图所示,root用户允许启动的线程数为unlimited,即无限制,除此之外的所有用户允许启用的线程为1024个
使用下面的命令可以查看每个用户的线程数量
ps h -Led -o user | sort | uniq -c | sort -n
参数说明:
h 隐藏表头,用于统计时不影响统计结果
L 以线程维度展示数据
e 展示所有用户的线程
d 展示线程的ID(可以不用这个参数)
o 可选项,此处取值user为只展示进程的用户名
sort命令:排序
uniq -c 统计重复数据出现的数量
如图所示,root用户有2574个线程,超出当前用户可用线程数,因此sudo -i报错
用以下命令确定是哪个进程的线程过多
cat `ls /proc/|grep [0-9][^a-z]|awk '{print "/proc/"$1"/status"}'`|grep -w -E -i 'Pid|Threads'
参数说明:
ls /proc/|grep [0-9][^a-z] :列出所有进程号
awk '{print "/proc/"$1"/status"}':拼接成“/proc/{进程号}/status”的形式,该文件有进程的详细信息
最后cat每一个“/proc/{进程号}/status”文件,再用grep正则匹配出记录了Pid那行和Threads那行
如图所示,确定是5435这个pid的进程线程数有2257个
解决方案,重启电脑或用root账号登录后kill掉该进程就可以了