0

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

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

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

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

感谢您的任何提示!

4

2 回答 2

3

不能有任何/usr/bin/ulimit(或/usr/bin/cd)可执行文件,因为setrlimit(2)系统调用在当前shell 进程上运行(更改当前进程的属性,默认情况下该属性将被其他子进程继承,请参阅fork(2) & execve(2 ))。因此ulimit,就像cd(调用chdir(2)系统调用)一样,必须是内置的 shell

从您的C程序内部只需调用setrlimit系统调用。不要忘记测试失败(并且在失败显示上errno可能使用perror or strerror)。要查询当前限制,请使用getrlimit(2)或在程序中按顺序读取/proc/self/limits伪文件(请参阅proc(5)了解更多信息,或/proc/1234/limitspid 1234 的进程)。

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/

于 2014-04-08T10:49:03.750 回答
2

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

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

这给了我我想要的。

干杯

于 2014-04-08T12:38:09.643 回答