关于"su:不能切换用户id:资源暂时不可用"的问题


    一、问题发生的背景:

   在一台测试服务器上搭建一套应用环境,正在做着,当我开启了最后一个程序时,终端突然提示说命令不可用了,无论我做什么动作都直接拒绝。当时以为是这个终端出了问题,于是打算再开一个终端,却再也无法登陆上去了。

   我就觉得很奇怪,一开始以为是这台服务器挂了,但是当我去平台查看时发现仍然是正常运转的,只是内存使用率较高。此时登陆的用户是root,而我搭建应用环境用的是普通用户,所以我想通过su命令切换回那个用户,当我执行了这个操作时,如题问题就出现了。

   为什么root用户可以正常使用,而其他普通用户就不可以了呢?并且,错误提示是“资源暂时不可用”,是不是因为普通用户做了资源使用限制?因为这个问题是在我开了很多进程之后才出现的,所以有理由这样怀疑。

   二、解决问题的思路:

   通过上网搜索,了解到了能够控制用户资源的文件一般有两个,一是/etc/profile,二是/etc/security/limits.conf。

   先来了解一下这两个文件:

   1./etc/profile是环境变量配置文件,可能也有ulimit配置,不过在查看了我自己的后,发现这里并没有做特别的limit限制;

   2./etc/security/limits.conf

关于su: cannot set user id: Resource temporarily unavailable的问题_第1张图片

domain: 

是指限制的对象,可以是个人,也可以是组,组前面要加@符号,也可以设置为除root用户外的 任何人,用*号表示;

type:

是指类型,soft是当前系统生效的值,hard是系统可以设置的最大值;

item:

项目,是可以对什么项目做限制,如最大进程数,文件最大值;

value:

值,所设置的值的大小。


   疑惑的是,在/etc/security/limits.conf配置文件中可以看到,进程数和打开文件数的最大值,已经开得够大了,可是为什么还会出现这种现象呢?

   经过查找,发现Centos6.x版本后,还有一个配置文件对ulimit设置生效,就是/etc/security/limits.d/90-nproc.conf,果然,打开文件后发现,默认最大进程数只有1024,明显是不能满足我搭建应用环境的需求的。于是,把1024改成10240后,再执行su qjzh就成功了。同时,可以看到,对root是unlimited的。


关于su: cannot set user id: Resource temporarily unavailable的问题_第2张图片


解决这个问题的方法有两个:

1.把无用的进程杀掉;

2.把最大进程限制数调大。


       另外,可以使用ulimit命令来临时设置各种资源限制,并且通过  ulimit -a  命令可以查看当前用户的各种限制值的大小。