Я готовлю сценарий для оценки некоторого кода, поступающего от других людей, поэтому мне нужно максимально ограничить среду исполнения.
Сценарий разработан под python3.4 с использованием psutil и подпроцесса, целевой файл для запуска — это скомпилированный код C ++ со всем, чего мне следует избегать (очень большое выделение памяти, высокая загрузка ЦП, создание форка и т. Д.).
Как документация, я прочитал эта страница а также этот репозиторий а также этот урок, но тем не менее, когда я вызываю процесс из python, он, кажется, игнорирует любое ограничение.
Инструкция, которая выполняет мой скрипт:
PROC = subprocess.Popen(["sleep 1 ; ./local_tmp/test"], shell=True, preexec_fn=preExecFunction)
Зачем спать 1? Потому что согласно этот вопрос процесс может быть вызван без ограничений, поэтому я ставлю режим сна, чтобы задержать его и дать время питону ограничить весь процесс.
Что делает preExecFunction? В основном это ограничение среды с помощью вызовов функции setrlimit ресурса в python (документ в первой ссылке, которую я дал)
Сегмент кода CPP:
struct rlimit rl;
getrlimit (RLIMIT_NPROC, &rl);
printf("Default value is : %lld\n", (long long int)rl.rlim_cur);
int pid = fork();
printf("Default value is : %lld\n", (long long int)rl.rlim_cur);
printf("%d\n",pid);
Вывод кода CPP
Default value is : 0
Default value is : 0
31670
Любая помощь будет принята с благодарностью. Спасибо!
редактировать : Я запускаю скрипт python от имени пользователя root, потому что иначе я не могу запустить библиотеку psutil.
Задача ещё не решена.
Других решений пока нет …