Как применить пределы памяти всем заданиям крона?

На общем сервере (Debian Jessie) существуют некоторые пределы памяти (и другие пределы, как количество процессов), которые запрашивают группу пользователей, настроенных в /etc/security/limits.conf.

Кажется, что те пределы не относятся к процессам, запущенным кроном, тем не менее, и иногда задание крона людей случайно завинчивает производительность для всех других.

Есть ли любой способ применить пределы от limits.conf к заданиям крона также? Или, если это не возможно, по крайней мере, осуществите некоторые пределы заданиям крона всех пользователей?

Крон, кажется, выполняет все задания в кроне cgroup, не в cgroup пользователей, таким образом, это не свободный доступ также :(

4
задан 4 August 2015 в 22:51
1 ответ

Я уверен, что вы не можете установить ограничения на сервис через limit.conf, но только на пользовательском пространстве.

Crontab выполняет скрипты в назначенном пользовательском пространстве, определенном либо из /etc/crontab через имя пользователя, либо из личного кронтаба пользователя. Таким образом, ограничения должны применяться на уровне пользовательского пространства или изнутри самого скрипта. Но это правильно, что вам нужно включить ограничения в pam.d/cron, так как это позволяет cron применять пользовательские ограничения при выполнении скрипта.

Я настроил небольшой тестовый сценарий, чтобы мы могли проверить, как ограничить задания пользователей cronjobs.

1) Сделал пользователя с именем crontest

2) Добавлена одна строка в limit.conf

crontest        hard    as              50000

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);
    }
}

Сохраните приведенный выше исходный код в mem.c и введите следующее, чтобы скомпилировать его.

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

Теперь для проверки

В качестве root я запустил скрипт проверки памяти, и вот результат. Как видите, я могу выделить более 50 МБ оперативной памяти (AddressSpace)

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

Затем я перешел к новому тестовому пользователю и попробовал то же самое.

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

Как видите, система отключила меня, так как я пытался выделить следующие 10 МБ, которые попали бы в 50 МБ (мой лимит).

Далее я добавил следующее в /etc/crontab

* * * * * crontest /bin/mem

Сохранил кронтаб и подождал, пока крон не породит мой пользовательский скрипт под crontest пользователем. Теперь я вижу, что те же самые вещи применяются к моему пользовательскому скрипту crontab просто прекрасно.

Выход из cron.log, показывающего скрипт start

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

Выход из syslog, показывающего скрипт dieing again..

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]

Так что, как вы можете видеть, ограничение применяется как к пользовательскому окружению при входе в систему, так и к cronjobs. Так что я думаю, что вам нужно взглянуть на ваш файл limits.conf, я не думаю, что он корректен.

1
ответ дан 3 December 2019 в 04:09

Теги

Похожие вопросы