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

mor*_*itz 5 linux ulimit cron limits

在共享服务器 (Debian Jessie) 上,有一些内存限制(和其他限制,例如进程数)适用于在/etc/security/limits.conf.

然而,这些限制似乎不适用于由 cron 启动的进程,有时人们的 cron 工作会意外地破坏所有其他人的性能。

有什么方法可以将限制应用limits.conf到 cron 作业吗?或者,如果这不可能,至少对所有用户的 cron 作业实施一些限制?

Cron 似乎在 cron cgroup 中运行所有作业,而不是在用户的 cgroup 中,因此这也不是一种简单的方法:(

小智 2

我很确定您不能通过 limit.conf 对服务设置限制,而只能在用户空间上设置限制。

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

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

1)创建一个名为crontest的用户

2)在limits.conf中添加一行

crontest        hard    as              50000
Run Code Online (Sandbox Code Playgroud)

3)制作了一个快速的小测试脚本来分配内存。您可以在互联网上找到比我的好得多的源代码示例,但它确实有效。

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

将上述源代码保存到 mem.c 中并输入以下内容进行编译。

gcc mem.c -o mem
cp mem /bin/mem
Run Code Online (Sandbox Code Playgroud)

现在来测试

我以 root 身份运行了 mem 测试脚本,这是输出。正如你所看到的,我可以分配超过 50MB RAM(地址空间)

# mem
Using 10 MB
Using 20 MB
Using 30 MB
Using 40 MB
Using 50 MB
Using 60 MB
^C
Run Code Online (Sandbox Code Playgroud)

然后我更改为新的测试用户并尝试了相同的操作。

$ mem
Using 10 MB
Using 20 MB
Using 30 MB
Using 40 MB
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,当我试图分配下一个 10MB 的空间时,系统打断了我,而这 10MB 的空间本来会达到 50MB(我的限制)。

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

* * * * * crontest /bin/mem
Run Code Online (Sandbox Code Playgroud)

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

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

Nov 22 16:52:01 server CRON[31460]: (crontest) CMD (/bin/mem)
Run Code Online (Sandbox Code Playgroud)

系统日志的输出显示脚本再次终止。

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]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该限制既适用于登录时的用户环境,也适用于 cronjobs。所以我认为你需要看看你的 limit.conf 文件,我认为它不正确。