ulimit命令的单独(二进制)实现?

时间:2014-04-08 10:45:11

标签: linux limits ulimit

是否有 / usr / bin / ulimit 的源代码?我需要查看用户的完整列表rlimit,而不是他在shell中。

在这种情况下,我们在从Web服务器运行内存密集型程序时遇到问题(用户wwwrun,/bin/false中通常有/etc/passwd作为登录shell),我们怀疑某些系统强加的限制是阻止它完成这些程序。

以前,有一个/ usr / bin / ulimit二进制文件,但这些似乎已经消失了。

所以我正在寻找的是ulimit命令的C实现(现在通常只能用作内置的(ba)sh)。它不需要任何“setrlimit”功能 - 只需打印所有限制即可。然后我们将此命令设置为wwwrun的登录shell,“su - wwwrun”将显示该用户拥有的所有rlimits。

感谢任何提示!

2 个答案:

答案 0 :(得分:3)

不能有任何/usr/bin/ulimit(或/usr/bin/cd)可执行文件,因为setrlimit(2)系统调用操作当前 shell进程(更改当前属性)默认情况下,进程将由其他子进程继承,请参阅fork(2)& execve(2))。所以ulimit,如cd(调用chdir(2)系统调用),必须是内置的shell

C 程序内部调用setrlimit系统调用。不要忘记测试失败(并且可能使用errnoperror显示失败strerror。要查询当前限制,请使用getrlimit(2)或在您的程序中按顺序读取/proc/self/limits伪文件(有关详细信息,请参阅proc(5);有关pid 1234的过程,请参阅/proc/1234/limits )。

FILE* f = fopen("/proc/self/limits", "r");
if (f) {
   char linbuf[128];
   do { 
     memset (linbuf, 0, sizeof(linbuf));
     fgets (linbuf, sizeof(linbuf), f);
     fputs(linbuf, stderr);
   } while (!feof(f));
   fclose (f);
   fflush(NULL);
} else perror("/proc/self/limits");

我还建议您阅读Advanced Linux Programmingintro(2)。另请参阅Linux PAM/etc/security/limits.conf以及/etc/pam.d/

下的配置文件

答案 1 :(得分:2)

感谢提示 - 我已经设置了一个简单的文本文件cat-limits作为wwwrun的登录shell,只包含一行

#!/bin/cat /proc/self/limits

这给了我想要的东西。

干杯