linux非root用户使用sudo报too many processes问题

今天使用sudo发现报错,百度无果,最后从提示入手排查进程数解决了该问题

该错误是由于root正在运行的核心线程数(了解后这里processes是指LWP(light weight process轻量级进程,每个轻量级进程对应一个核心线程))多于当前用户所允许使用的核心线程数数量,导致无法切换到root权限引起的报错


1.png

该核心线程数限制的配置在/etc/security/limits.d/90-nproc.conf文件


2.png

如上图所示,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报错


3.png

用以下命令确定是哪个进程的线程过多

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个


4.png

解决方案,重启电脑或用root账号登录后kill掉该进程就可以了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容