最近在登录开发机时,有报错如下:
-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、用户来看,也不难理解可行与否了。