如何将内存限制应用于所有的cron作业?

在共享服务器上(Debian Jessie),在/etc/security/limits.confconfiguration了一些内存限制(以及其他限制,如进程数量),这些限制适用于一组用户。

看来,这些限制并不适用于由cron开始的stream程,有时候人们的cron工作却意外地把所有其他的performance搞砸了。

有没有办法将limits.conf的限制应用于cron作业? 或者,如果这是不可能的,至less强制所有用户的cron作业的限制?

Cron似乎在cron cgroup中运行所有的工作,而不是在用户的cgroup中,所以这不是一个简单的方法:

我敢肯定你不能通过limits.conf在服务上设置限制,而只能在用户空间上设置限制。

Crontab在通过用户名从/ etc / crontab或用户自己的个人crontab定义的指定用户空间中执行脚本。 所以限制必须应用在用户空间级别上,或者从脚本自身内部应用。 但是,您需要启用pam.d / cron下的限制是正确的,因为这使得cron在执行脚本时可以应用用户限制。

我设置了一个小testing场景,所以我们可以检查如何限制用户的cronjobs。

1)做了一个名为crontest的用户

2)在limits.conf中添加了一行

 crontest hard as 50000 

3)做一个快速的小testing脚本来分配内存。 你可以在互联网上find比我的方式更好的源代码示例,但它的工作原理。

 #include <malloc.h> #include <unistd.h> #include <memory.h> #define MB 1024 * 1024 int main() { int size; size = 0; while (1) { void *p = malloc( 10*MB ); memset(p,0, 10*MB ); size = 10+size; printf("Using %d MB\n",size); sleep(1); } } 

将上面的源代码保存到mem.c中,并input以下内容进行编译。

 gcc mem.c -o mem cp mem /bin/mem 

现在来testing

以root身份运行memtesting脚本,这是输出。 正如你所看到的,我可以分配超过50MB的RAM(AddressSpace)

 # mem Using 10 MB Using 20 MB Using 30 MB Using 40 MB Using 50 MB Using 60 MB ^C 

然后,我改变了我的新testing用户,并尝试相同的。

 $ mem Using 10 MB Using 20 MB Using 30 MB Using 40 MB Segmentation fault 

正如你可以看到,当我试图分配下一个10MB,将达到50MB(我的限制),系统切断了我。

接下来,我将以下内容添加到/ etc / crontab

 * * * * * crontest /bin/mem 

保存crontab并等待cron在crontest用户下产生我的用户空间脚本。 我现在可以看到,同样的事情适用于我的用户crontab脚本就好了。

显示脚本启动的cron.log输出

 Nov 22 16:52:01 server CRON[31460]: (crontest) CMD (/bin/mem) 

系统日志输出显示脚本再次死亡

 Nov 22 16:52:05 server kernel: [624832.216083] mem[31464]: segfault at 8 ip 00007f87868f51b8 sp 00007ffce83fa058 error 6 in libc-2.24.so[7f8786871000+195000] 

所以你可以看到这个限制既适用于login时的用户环境,也适用于cronjobs。 所以我认为你需要看看你的limits.conf文件,我不认为这是正确的。