Linux 系统无法登录?你的程序有问题吧!

今天遇到一个问题,有个用户连接不上服务器(无法ssh远程连接)

su: failed to execute /bin/bash: Resource temporarily unavailable

谷歌搜索一番后:

原因:用户最大进程数参数(nproc)已经达到最大值,无法再给要执行的/bin/bash 分配空闲资源,无法执行/bin/bash就代表你什么也做不了。

linux 下这个文件限定了用户进程数(文件名可能不一样,目录应该不差):

/etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

* soft nproc 4096
root soft nproc unlimited
显而易见,默认配置普通用户进程数是有限制的,root用户没有限制(这就是为什么root用户和其他用户可以登录)
查看linux 下所有用户的 进程数:
ps h -Led -o user | sort | uniq -c | sort -n
进程数  用户名
2      postfix
123    root
4096   tomcat
这样就很清晰的知道 tomcat的用户进程数达到了阈值
接下来查找什么进程导致的数量那么多, 通过以下命令查看进程信息
ps axu | grep tomcat 或 ps -ef | grep tomcat 
#(这里的tomcat是指那个登录不了的用户)
如果你的进程真的需要存在,那么 调整限制文件里的配置将4096 调到 8192 或更大
如果你发现进程不是你需要的可以停掉,实在不行就 kill -9 进程号
这里可能会遇到问题, 通过ps aux 或 ps -ef 查找出来的进程发现进程数并没有 4096那么多,原因是进程中的 线程没有被查询出来,默认情况下采用 ps 命令并不能显示出所有的进程。因为 Linux 环境下执行多线程,每个线程都将以一个轻量级进程(light-weight process [LWP])的形式执行,可以通过加-L来查看:
ps aux -L 
#或 
ps -efL
查找出对应的进程后,看情况该关掉停掉的就close吧Kill 吧,如果程序是必须的就调整用户线程数吧
后话:真正的原因
  项目里面有个方法用了多线程,而这个方法结束后没有回收或者结束掉这些子线程 T T
补充:
  如果你的系统没有其他用户(root也无妨使用),找运维吧。如果你就是运维,我也不知道怎么办呀,重启(释放进程)试试吧!(不建议重启系统)
 

猜你喜欢

转载自www.cnblogs.com/gonson/p/9470423.html