由登录服务器时ulimit配置报错,也谈下ulimit配置

最近在登录开发机时,有报错如下:

-bash:  cannot modify limit: Operation not permitted

一定是哪个地方有ulimit设置,想想看,用户登录或用户su命令切换时,系统会调用以下脚本:

/etc/profile.d/file 
    /etc/profile 
    /etc/bashrc 
    /lebyzhao/.bashrc 
    /lebyzhao/.bash_profile

可能是这里面有ulimit -n的配置,检查一下,果然在/etc/profile中,有行ulimit -n 65535

当你以lebyzhao登录时,你不是root,没有权限执行,才显示了上面的报错。

这里注释掉/etc/profile这行即无报错。

ulimit -n配置很关键,所以这里在啰嗦一下,因为这个和当前登录session、用户甚至用户组limits配置相关,有时看起来很蹊跷。

除了应用ulimit -n, 也可以甚至是需要修改linux的软硬件限制文件/etc/security/limits.conf:

如添加如下代码: 
    * soft nofile 20480
    * hard nofile 20480
    所有用户打开的文件数被限制为65535。简单解释下这里命令格式是users type item value,users是以符号@开头的用户名或组名(不加@测试也可以),*表示所有用户,type设置为hard or soft。item指定想限制的资源,如cpu,core nofile nproc or maxlogins,value则就是相应的限制值。

这样登录的时候pam就会从从limits.conf中设置上限(当然,ulimit命令可以在低于上限的范围内再行设置)

  -H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬资源,线程栈大小为 64K。

  -S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 ulimit – Sn 32;限制软资源,32 个文件描述符。如果超过了这个上限,-S 你会得到下面的错误提示:

ulimit: open files: cannot modify limit: Invalid argument

另外,网上看,好像有内核还提供了设置接口:/proc/sys/fs /nr_open,大家有兴趣可以在搜索看下。

 

总之,我们用ulimit -n 命令在本次shell session中、服务器进程启动(脚本)时、用户登录如/etc/profile里进行设置,或者设置limits.conf,都可以达到你的目的,场景和优劣也很明显。

 

如果你还有兴趣:我们用sudo limit -n 65536测试设置时,会提示找不到命令,原因是ulimit 和cd等一样,是内核内建的指令,并不是/usr/sbin等下面的二进制程序命令。那请问一下,如果非要在自己(非root)登录后设置,是否可以这样:sudo sh -c "ulimit -n 65535"?结合sudo、用户来看,也不难理解可行与否了。

上一篇:ArcGIS网络分析之Silverlight客户端路径分析(三)


下一篇:网页中使用CSS和JS阻止用户选择内容