是否有 / 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。
感谢任何提示!
答案 0 :(得分:3)
不能有任何/usr/bin/ulimit
(或/usr/bin/cd
)可执行文件,因为setrlimit(2)系统调用操作当前 shell进程(更改当前属性)默认情况下,进程将由其他子进程继承,请参阅fork(2)& execve(2))。所以ulimit
,如cd
(调用chdir(2)系统调用),必须是内置的shell
从 C 程序内部调用setrlimit
系统调用。不要忘记测试失败(并且可能使用errno
或perror
显示失败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 Programming和intro(2)。另请参阅Linux PAM和/etc/security/limits.conf
以及/etc/pam.d/
答案 1 :(得分:2)
感谢提示 - 我已经设置了一个简单的文本文件cat-limits
作为wwwrun的登录shell,只包含一行
#!/bin/cat /proc/self/limits
这给了我想要的东西。
干杯