Я хотів би створити сценарій автоматичного тестування / оцінювання для студентів в системі Linux таким чином:
- Будь-який студент-користувач може ініціювати сценарій у будь-який час.
- Окремий сценарій (з кореневими привілеями) копіює код студента у файловий простір, не доступний для студентів, використовуючи одиничні тести, доступні не для студентів, тощо.
- Користувач отримує обмежений зворотний зв'язок у вигляді текстового файлу, сформованого сценарієм оцінювання.
Коротше кажучи, я прагну створити щось подібне до систем подання програм на конкурс, але дозволяючи багатший зворотній зв'язок, не розкриваючи тестування всіх викладачів.
Я б міг уявити, що розгульна поведінка між нимиодин ініціюючий скрипт і один сценарій крона з дозволом root можуть бути в порядку. Чи є моделі / приклади того, як можна найкраще структурувати зв’язок між ініційованим користувачем сценарієм та окремим ініційованим кореневим скриптом для таких цілей?
Відповіді:
0 для відповіді № 1Є багато варіантів.
Речі, які я б зазначив у першому рядку:
- Не використовуйте су; використовувати судо; Для цього є кілька причин, і головна причина, яку потрібно використовувати су вам потрібен пароль користувача, яким ви хочете бути і з яким судо - ти не «т;
- Сценарії не можуть бути суїд, ви повинні використовувати бінарні файли або просто звичайний скрипт, який буде розпочато з використання
sudo
(звичайно, студенти повинні матиsudoers
запис, що дозволяє їм використовувати сценарій); - Крон не так швидко, як вам теоретично може знадобитися; cron виконує завдання щохвилини; будь ласка, врахуйте Inotify використання;
- Для зв'язку між компонентами вашої системивам потрібно щось, що реагуватиме в режимі реального часу; Є багато компонентів / бібліотек / фреймворків, які можуть вам допомогти, але рекомендую поглянути ZeroMQ і Редіс;
- Результати виконання / тестів сценаріїв можна записати або у файлову систему (я думаю, що це було б краще), або в СУБД.
0 для відповіді № 2
Якщо ви хочете дотримуватися сценаріїв оболонок, тоМетод, який я пропоную для спілкування між процесами, полягав би в тому, щоб кореневий скрипт постійно перевіряв іменовану трубу на вхід (тобто продовжувати відкривати її після кожного eof) і надсилати кожен вхід за допомогою будь-яких різноманітних тестів. Нехай частина входу буде "зворотною адресою" - куди відправити результат.
Це повинно дозволяти виконувати випробування в апривілейований простір, не піддаючи студентам ніякого контролю над привілейованим простором. Студентам не потрібно судо, а вам не потрібно тягнути до бібліотек. Просто запропонуйте студентам передати свій код у непривілейований скрипт, який додає зворотну адресу та будь-яку іншу розмітку, яка вам може знадобитися, а потім надає її до названої труби.